home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / expressions.s < prev    next >
Text File  |  2001-02-17  |  121KB  |  6,398 lines

  1.  
  2. ;; Expression support
  3. ; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ;
  4. ;   The Expression Calculation Part             ;
  5. ; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ;
  6. ;; EAEXP!!!
  7.  
  8.  
  9. ; ea specific version of EXP: optimizes some superfluous code away
  10. ;
  11. ; HANDLED ARE:
  12. ;
  13. ; MOVE.L #VAL,D0        6   1
  14. ; LEA X(PC),A0; MOVE.L A0,D0    6   'bla'
  15. ; MOVE.L X(A5),D0       4   a
  16. ; MOVEQ #VAL,D0         2   1
  17. ; MOVE.L Dx,D0          2   a
  18. ;
  19. ; RESULT IN D0:     0   NO OPTI DONE
  20. ;           1   OPTI DONE, BUT DON'T MOVE (MAY USE A0 TOO)
  21. ;           <ADR>   OPTI DONE, <ADR>..A4 IS CODE
  22. EAEXP:
  23.     MOVEM.L A1/D3/D4,-(A7)
  24.     MOVE.L  A4,-(a7)
  25.     MOVE.W  EAREQUEST,-(A7)
  26.     BCLR    #2,ICODEPREFS+3
  27.     BSR EXP
  28.     MOVE.w  (A7)+,EAREQUEST
  29.     move.l  (a7)+,a1
  30.     MOVE.L  A4,D3
  31.     SUB.L   A1,D3
  32.     CMP.L   #7,D3
  33.     BPL     .LASTADR
  34.     CMP.L   #2,D3
  35.     BNE     .1
  36. ;*-*
  37.  
  38. ;; MOVEQ
  39.  
  40.     CMP.B   #%01110000,(A1)
  41.     BNE .M
  42.     MOVE.W  EAREQUEST(PC),D3
  43.     CMP.W   #17,D3
  44.     BPL .X
  45.     CMP.W   #16,D3
  46.     BEQ     .3
  47.     CMP.W   #8,D3
  48.     BPL     .5
  49.     LSL.W   #1,D3
  50.     OR.B    D3,(A1)         ; ** MOVEQ #1,Dx
  51.     BRA     .OK
  52. .3: MOVE.B  1(A1),D4
  53.     beq     .3C
  54.     EXT.W   D4
  55.     MOVE.W  D4,(A4)+        ; ** PEA 1.W
  56.     MOVE.W  .4(PC),(A1)
  57.     BRA     .OK
  58. .3C:move.w  .4C,(a1)
  59.     bra     .OK
  60. .4: PEA     1.W
  61. .4C:CLR.L   -(a7)
  62.  
  63. .5: MOVE.B  1(A1),D4
  64.     EXT.W   D4
  65.     TST.W   D4
  66.     BEQ     .5xx
  67.     MOVE.W  D4,(A4)+        ; ** MOVE.W 1,Ax
  68.     MOVE.W  .6(PC),D4
  69.     LSL.W   #8,D3
  70.     LSL.W   #1,D3
  71.     OR.W    D3,D4
  72.     MOVE.W  D4,(A1)
  73.     BRA     .OK
  74. .5xx:
  75.     MOVE.W  .62(PC),D4
  76.     OR.W    D3,D4
  77.     LSL.W   #8,D3
  78.     LSL.W   #1,D3
  79.     OR.W    D3,D4
  80.     MOVE.W  D4,(A1)+
  81.     MOVE.L  A1,A4
  82.     BRA     .OK
  83.  
  84. .6: MOVE.W  #1,A0
  85. .62:SUB.L   A0,A0
  86.  
  87. .1: CMP.L   #4,D3
  88.     BNE     .2
  89.  
  90. ;*-*
  91. ;; VAR
  92.     MOVE.W  (A1),D3
  93.     and.w   #$fffe,d3
  94.     CMP.W   #%0010000000101100,D3
  95.     BNE     .X
  96.  
  97.     BSR.W   DOOPT           ; ** MOVE.L 2(A5),Rx/-(A7)/2(A5)
  98.     BRA     .OK
  99. ;*-*
  100. ;; MOVE.L Dx,D0
  101.  
  102. .M: MOVE.W  (A1),D3
  103.     AND.W   #%1111111111111000,D3
  104.     CMP.W   #%0010000000000000,D3
  105.     BNE     .X
  106.     BSR     DOOPT           ; ** MOVE.L Dx,Rx/-(A7)/2(A5)
  107.     BRA     .OK
  108.  
  109.  
  110. .2: CMP.W   #%0100000111111010,(A1)
  111.     BEQ     .7              ; ** LEA xx(PC),A0
  112.     move.w  (a1),d3
  113.     bclr    #0,d3
  114.     CMP.W   #$41EC,d3
  115.     beq     .7
  116. ;*-*
  117. ;; MOVE.L
  118.  
  119.     CMP.W   #%0010000000111100,(A1)
  120.     BNE     .X
  121.     MOVE.W  EAREQUEST(PC),D3
  122.     CMP.W   #16,D3
  123.     BNE     .9
  124.     TST.W   2(A1)
  125.     BEQ     .8
  126.     CMP.W   #-1,2(A1)
  127.     BEQ     .10
  128. .9: BSR     DOOPT           ; ** MOVE.L #1,Rx/-(A7)/2(A5)
  129.     BRA     .OK         ; ** PEA 1.W
  130. .8: TST.W   4(A1)
  131.     BMI     .9
  132. .11:    MOVE.W  .4(PC),(A1)
  133.     MOVE.W  4(A1),2(A1)
  134.     SUBQ.L  #2,A4
  135.     BRA     .OK
  136. .10:    TST.W   4(A1)
  137.     BMI     .11
  138.     BRA     .9
  139. ;*-*
  140. ;; LEA+MOVE
  141. .7:
  142.     CMP.W   #%0010000000001000,4(A1)
  143.     BNE     .X          ; ** MOVE.L A0,D0 [after LEA]
  144.     MOVE.W  EAREQUEST(PC),D3
  145.     CMP.W   #16,D3
  146.     BPL     .OT
  147.     CMP.W   #8,D3
  148.     BPL     .A
  149.     OR.W    #%110000000000,(A1)
  150.     ADDQ.L  #4,A1
  151.     OR.W    #%110,(A1)
  152.     BSR     DOOPT           ; ** MOVE.L A0,Dx
  153.     SUBQ.L  #4,A1
  154.     BRA     .OKNM
  155. .A: SUBQ.L  #2,A4
  156.     BSR     DOOPT           ; ** MOVE.L LAB(PC),Ax
  157.     BRA     .OKNM
  158. .OT:
  159.     cmp.w   #16,EAREQUEST
  160.     bne     .OTX
  161.     cmp.w   #%0100000111111010,(a1)
  162.     bne     .OT2            ; ** LEA xx(PC),A0
  163.     move.w  #%0100100001111010,(a1)
  164.     subq.l  #2,a4
  165.     bra     .OKNM
  166. .OT2:
  167.     move.w  (a1),d3
  168.     bclr    #0,d3
  169.     cmp.w   #$41ec,d3
  170.     bne     .OTX            ; ** LEA xx(A5),A0
  171.     move.w  (a1),d3
  172.     and.l   #1,d3
  173.     or.w    #$486c,d3       ; ** PEA 4(A5)
  174.     move.w  d3,(A1)
  175.     subq.l  #2,a4
  176.     bra     .OKNM
  177.  
  178. .OTX:
  179.     ADDQ.L  #4,A1
  180.     BSR     DOOPT           ; ** MOVE.L A0,-(A7)/2(A5)
  181.     SUBQ.L  #4,A1
  182.     BRA     .OKNM
  183.  
  184. .LASTADR:
  185.     btst    #2,ICODEPREFS+3
  186.     bne     .X
  187.     move.l  LAST_CMD_ADR,d0
  188.     beq     .X
  189.     move.l  d0,a1
  190.     move.l  a4,d0
  191.     sub.l   a1,d0
  192.     cmp.l   #6,d0
  193.     bgt     .X
  194.     cmp.w   #16,EAREQUEST
  195.     bne     .X
  196.     cmp.w   #2,d0
  197.     bgt     .X
  198.     cmp.w   #$2008,(a1)     ; ** MOVE.L A0,D0 [arrays]
  199.     bne     .X
  200.     move.w  #$2f08,(a1)     ; ** -> MOVE.L A0,-(A7)
  201.     bra     .OKNM
  202.  
  203.  
  204. .OK:
  205.     MOVE.L  A1,D0
  206.     BRA     .OUT
  207. .OKNM:
  208.     MOVEQ   #1,D0
  209.     BRA     .OUT
  210. .X: MOVEQ   #0,D0
  211. .OUT:
  212.     MOVEM.L (A7)+,A1/D3/D4
  213.     RTS
  214. ;*-*
  215.  
  216. DOOPT:  MOVE.W  EAREQUEST(PC),D3
  217.     CMP.W   #17,D3          ; A1=OPCODE
  218.     BPL.S   .VAR
  219.     CMP.W   #16,D3
  220.     BEQ.S   .ST
  221.     LSL.W   #3,D3
  222.     BTST    #6,D3
  223.     BEQ.S   .XX
  224.     BCLR    #6,D3
  225.     BSET    #0,D3
  226.     BRA.S   .XX
  227. .ST:MOVE.W  #%111100,D3
  228. .XX:LSL.W   #6,D3
  229.     OR.W    D3,(A1)
  230.     RTS
  231.  
  232.  
  233. .VAR:   ORI.W   #%0000101101000000,(A1) ; SET TO MOVE.L EA,2(A5)
  234.     MOVE.L  A2,D4
  235.     MOVE.L  A6,D0
  236.     LEA -2(A4),A2
  237.     CMPA.L  A2,A1
  238.     BEQ GRUNT
  239.     MOVE.W  (A2),-(A7)
  240.     MOVE.W  (A1),(A2)
  241.     MOVE.L  EAIDENT(PC),A6
  242.     JSR GVA6D3_9
  243.     MOVE.W  (A2),(A1)
  244.     MOVE.W  (A7)+,(A2)
  245.     MOVE.L  D0,A6
  246.     MOVE.L  D4,A2
  247.     RTS
  248. GRUNT:  MOVE.L  EAIDENT(PC),A6
  249.     JSR GVA6D3_9
  250.     MOVE.L  D0,A6
  251.     MOVE.L  D4,A2
  252.     RTS
  253.  
  254.  
  255.  
  256. EAREQUEST:    DC.W    0   ; 0-15=REG, 16=STACK, 17,25=VAR
  257. EAIDENT:      DC.L    0
  258.  
  259. TINYEXP:              ; GENERATES CODE FOR D0, JUST VALUES
  260.     MOVE.W  (A3)+,D0        ; TRASHES JUST D0
  261.     CMP.W   #VALUE,D0
  262.     BEQ.S   .1
  263.     CMP.W   #43,D0
  264.     BEQ.S   .1
  265.     CMP.W   #8,D0
  266.     BNE ERROR30
  267.     CMP.W   #43,(A3)
  268.     BEQ.S   .NF
  269.     CMP.W   #VALUE,(A3)+
  270.     BNE ERROR30
  271.     MOVE.L  (A3)+,D0
  272.     NEG.L   D0
  273.     BRA.S   .2
  274. .1: MOVE.L  (A3)+,D0
  275. .2: CMP.L   #128,D0
  276.     BPL.S   .3
  277.     CMP.L   #-128,D0
  278.     BMI.S   .3
  279.     MOVE.B  .4(PC),(A4)+
  280.     MOVE.B  D0,(A4)+
  281.     RTS
  282. .3: MOVE.W  .5(PC),(A4)+
  283.     MOVE.L  D0,(A4)+
  284.     RTS
  285. .4: MOVEQ   #1,D0
  286. .5: MOVE.L  #1,D0
  287. .NF:    ADDQ.L  #2,A3
  288.     MOVEM.L D0-D1/A0-A1/A6,-(A7)
  289.     BSR ISOPENMATH
  290.     MOVE.L  MATHBASE(PC),A6
  291.     MOVE.L  (A3),D0
  292.     JSR -60(A6)         ; SPNEG
  293.     MOVE.L  D0,(A3)
  294.     MOVEM.L (A7)+,D0-D1/A0-A1/A6
  295.     BRA.S   .1
  296.  
  297.  
  298. FINDMEMBER:   ; *** FIND O.MEMBER, D1=TRASH,a1=first->REAL,a6=obj
  299.     MOVE.W  OID(A6),D1
  300.     CMP.W   OID(A1),D1
  301.     BEQ.S   .X
  302.     MOVEM.L D0/D3/A3-A5,-(A7)
  303.     MOVE.L  8(A1),D3
  304.     LEA OMEMB+4(A6),A3
  305. .XL:MOVE.L  ONEXT(A3),A3
  306.     MOVE.L  A3,D0
  307.     BEQ.S   .ERA3
  308.     MOVE.L  D3,A4
  309.     MOVE.L  OASCII(A3),A5
  310.     MOVE.L  A5,D0
  311.     BEQ.S   .XL
  312. .L2:    CMPM.B  (A5)+,(A4)+
  313.     BNE.S   .XL
  314.     TST.B   -1(A5)
  315.     BNE.S   .L2
  316.     CMP.W   OID(A3),D1
  317.     BNE.S   .XL          ; BNE ERA3
  318.     MOVE.L  A3,A1
  319.     MOVEM.L (A7)+,D0/D3/A3-A5
  320. .X: RTS
  321. .ERA3:  MOVEM.L (A7)+,D0/D3/A3-A5
  322.     BRA ERROR42
  323.  
  324.  
  325.  
  326. ; the main part for the objects  -  members  -  indexes
  327.  
  328. TYPERF_XXX:
  329.         DC.B    0
  330.         DC.B    0
  331.  
  332. EADDRESSMODI:         ; D5=-1/OTHER,A3=VOOR HELE EXP
  333.     MOVEM.L D3-D5/A1,-(A7)  ; D0=[0=-->D0,1=-->D1,2=D0-->]
  334.     CMP.W   #-1,D5          ;     SET(D5) PAR     PAR
  335.     BNE.S   .1
  336.     CMP.W   #1,D0
  337.     BNE.S   .1
  338.     MOVEQ   #0,D0           ; D0=FLAG
  339. .1: MOVE.W  (A3)+,D1
  340.     CMP.W   #32,D1          ; SEE IF ^IDENT
  341.     BPL PL
  342.     CMP.W   #IDENT,D1
  343.     BNE ERROR6
  344.     MOVE.L  (A3)+,A0        ; A0=IDENT
  345.     TST.B   4(A0)
  346.     BEQ ERROR22
  347.     CMP.B   #LAB,4(A0)
  348.     BEQ ERROR6
  349.     MOVE.B  16(A0),TYPERF_XXX  ; number of PTR TO's
  350.     MOVE.W  (A3)+,D1
  351.     CMP.W   #33,D1          ; SEE IF IDENT++
  352.     BPL PLX
  353. PLB:
  354.     CMP.W   #41,D1
  355.     BNE     .0
  356.     CMP.W   #31,(A3)+
  357.     BNE ERROR42
  358.     MOVE.L  (A3)+,.SPEC
  359.     MOVE.W  (A3)+,D1
  360.     CLR.L   .TDRF
  361.     MOVE.B  #-1,TYPERF_XXX
  362.     BRA .0_2        ; .DREFL
  363. .0:
  364.     MOVE.L  (A0),.SPEC
  365.     CLR.B   .TDRF
  366. .DREFL:
  367.     MOVE.L  COMPILEPROC(PC),A1
  368.     CMP.L   18(A1),A0
  369.     BEQ .0_2                    ; self can't be a ptr to ptr ... - problems
  370.     TST.B   TYPERF_XXX
  371.     BGT     .0_0
  372.     BMI     .0_2
  373.     MOVE.L  (A0),.SPEC
  374.     BRA     .0_1
  375. .0_0:
  376.     MOVE.L  #4,.SPEC
  377. .0_1:
  378.     SUBQ.B  #1,TYPERF_XXX
  379.     TST.B   TYPERF_XXX
  380.     BPL .0_2
  381.     CMP.W   #29,d1
  382.     beq     .0_2
  383.     move.l  (a0),.SPEC
  384.     subq.b  #1,TYPERF_XXX
  385. .0_2:
  386.  
  387.     AND.L   #$FFFF,D0
  388.     MOVE.W  D5,.KEEPD5
  389.  
  390.     MOVEQ   #0,D3
  391.     CMP.W   #29,D1          ; "["
  392.     BNE.W   .8
  393.     ADDQ.L  #4,A3           ; SKIP ]OFFSET
  394.     CMP.W   #30,(A3)        ; "[]"?
  395.     BEQ.W   .10
  396.     CMP.W   #VALUE,(A3)     ; "[VAL"
  397.     BNE.S   .9
  398.     CMP.W   #30,6(A3)       ; "[VAL]"
  399.     BNE.S   .9
  400.     MOVE.L  2(A3),D3        ; D3=OFFSET
  401.     ADDQ.L  #6,A3
  402.     BRA.S   .10
  403. .9: CMP.W   #IDENT,(A3)     ; "[VAR"?
  404.     BNE.S   .9B
  405.     CMP.W   #30,6(A3)       ; "[VAR]"?
  406.     BNE.S   .9B
  407.  
  408.     MOVE.L  2(A3),A6
  409.     MOVE.W  .OPTID2(PC),(A4)+
  410.     JSR GVA6D3_0
  411.     ADDQ.L  #6,A3
  412.     MOVEQ   #-1,D3
  413.     BRA.S   .10
  414.  
  415. ;; "Calculate expression in '[]'"
  416.  
  417. .9B:MOVEM.L D0/D3/A0,-(A7)
  418.     TST.B   .TDRF
  419.     BEQ.S   .NDR1
  420.     MOVE.W  .SAVA0(PC),(A4)+
  421. .NDR1:  MOVE.L  .SPEC(PC),-(A7)
  422.     MOVE.L  .TDRF(PC),-(A7)
  423.     CMP.W   #-1,D5
  424.     BEQ.S   .31
  425.     MOVE.W  .26(PC),(A4)+
  426.     BSR EXP
  427.     MOVE.L  .27(PC),(A4)+
  428.     BRA.S   .32
  429. .31:BSR EXP
  430.     MOVE.W  .30(PC),(A4)+
  431. .32:MOVE.L  (A7)+,.TDRF
  432.     MOVE.L  (A7)+,.SPEC
  433.     TST.B   .TDRF
  434.     BEQ.S   .NDR2
  435.     MOVE.W  .RETA0(PC),(A4)+
  436. .NDR2:  MOVEM.L (A7)+,D0/D3/A0
  437. ;*-*
  438.  
  439.     MOVEQ   #-1,D3
  440. .10:CMP.W   #30,(A3)+       ; "]"
  441.     BNE ERROR34             ;
  442.     MOVE.W  (A3)+,D1        ;
  443.  
  444. .8: SUBA.L  A1,A1           ; A1=OBJECT (member/NIL)
  445.     SUBA.L  A6,A6           ; A6=OBJECT (HEAD/NIL)
  446.     CMP.W   #41,D1          ; CHECK FOR POINTERTYPE
  447.     BNE.S   .NCAST          ;
  448.     CMP.W   #31,(A3)+       ; ::another objheader
  449.     BNE ERROR40             ;
  450.     MOVE.L  (A3)+,A6        ;
  451.     MOVE.W  (A3)+,D1        ;
  452. .NCAST:
  453.     CMP.W   #35,D1          ; "."
  454.     BNE .11
  455.     CMP.W   #42,(A3)        ; another objmemberascii
  456.     BEQ .EADDRMETHOD
  457.     CMP.W   #39,(A3)+       ; another objmember
  458.     BNE ERROR40
  459.     CMP.W   #17,4(A3)       ; "(" - method
  460.     BEQ .EADDRMETHOD2
  461.     MOVE.L  .SPEC,D1
  462.     CMP.L   #MAXOBJSIZE,D1
  463.     BMI ERROR40
  464.     MOVE.L  (A3)+,A1        ; A1=FIRST MATCH MEMBER
  465.     MOVE.L  A6,D2
  466.     BNE.S   .CASTO
  467.     MOVE.L  D1,A6           ; A6=OBJECTHEAD
  468. .CASTO: BSR FINDMEMBER
  469.     BRA.S   .SKM
  470. .FAKEO: DC.L    0,0,0,0
  471. .SKMS:  SUBQ.L  #2,A3           ; JUMPSPOT FOR OBJ[I]
  472.     LEA .FAKEO(PC),A1
  473. .SKM:   MOVE.L  .SPEC,D1
  474.     MOVE.L  D1,A2
  475.     MOVE.W  4(A2),D5
  476.     BRA.S   .12
  477. .11:    MOVE.L  .SPEC,D5        ; D5=OBJSIZE
  478.     CMP.L   #MAXOBJSIZE,D5
  479.     BPL .SKMS           ; !!!ERROR40
  480. .15:    SUBQ.L  #2,A3
  481. .12:    BSR PP          ; D2=INC/DEC
  482.     MOVEQ   #2,D1
  483.     BSR GENID
  484.  
  485.     TST.L   D3          ; DECIDE ON CODE-GEN
  486.     BEQ.S   .OO
  487.     BMI.S   .EO
  488.     BPL     .IO
  489.  
  490. ;; Object offset
  491.  
  492. .OO:    MOVEQ   #0,D1
  493.     CMP.L   A1,D1
  494.     BEQ.S   .13
  495.     MOVE.W  (A1),D1
  496.     EXT.L   D1
  497. .13:    BSR GEND2
  498.     BRA     .CONT
  499. ;*-*
  500. ;; Object index
  501.  
  502. .EO:
  503.     CMP.W   #1,D5
  504.     BEQ     .SO
  505.     CMP.L   #-1,D3
  506.     BNE ERROR31
  507.     CLR.W   .THE_FACTOR
  508.     CMP.W   #1,ECPU
  509.     BPL     .020_SCALE_FACTOR
  510.     CMP.W   #2,D5
  511.     BEQ.S   .S1
  512.     CMP.W   #4,D5
  513.     BEQ.S   .S2
  514.     CMP.W   #8,D5
  515.     BEQ.S   .S3
  516. .020_SCALE_FACTOR:
  517.     CMP.W   #2,D5
  518.     BEQ     .SF1
  519.     CMP.W   #4,D5
  520.     BEQ     .SF2
  521.     CMP.W   #8,D5
  522.     BEQ     .SF3
  523.     CMP.W   #16,D5
  524.     BEQ.S   .S4
  525.     MOVE.W  .28(PC),(A4)+
  526.     MOVE.W  D5,(A4)+
  527.     BRA.S   .SO
  528. .S4:    MOVE.W  .29+6(PC),(A4)+     ; OBJ OF 16
  529.     BRA.S   .SO
  530. .S3:MOVE.W  .29+4(PC),(A4)+     ; OBJ OF 8
  531.     BRA.S   .SO
  532. .S2:MOVE.W  .29+2(PC),(A4)+     ; LONG
  533.     BRA.S   .SO
  534. .SF1:MOVE.W #1,.THE_FACTOR
  535.     BRA     .SO
  536. .SF2:MOVE.W #2,.THE_FACTOR
  537.     BRA     .SO
  538. .SF3:MOVE.W #3,.THE_FACTOR
  539.     BRA     .SO
  540. .S1:MOVE.W  .29(PC),(A4)+       ; INT
  541. .SO:MOVEQ   #0,D1
  542.     CMP.L   D1,A1
  543.     BEQ.S   .CONT
  544.     MOVE.W  (A1),D1
  545.     BSR GENADD
  546.     BRA.S   .CONT
  547. ;*-*
  548. ;; Object offset+index
  549.  
  550. .OPC:   MOVE.L  2(A5),A0
  551.  
  552. .IO:    MOVEQ   #0,D1
  553.     CMP.L   A1,D1
  554.     BEQ.S   .14
  555.     MOVE.W  (A1),D1
  556.     EXT.L   D1
  557. .14:    MOVE.L  D3,D4
  558.     MULU    D5,D4
  559.     ADD.L   D4,D1
  560.     BSR GEND2
  561. ;*-*
  562.  
  563. ; FROM HERE D3=-1(D2 ALREADY CALC.), >0(RELA0)
  564.  
  565. .CONT:  ;MOVE.L #1,.SPEC        ; TO BE SURE
  566.     TST.B   .TDRF
  567.     BNE.S   .NXA5
  568.     MOVE.W  .OPC(PC),(A4)+      ; MOVE.L X(A5),A0
  569.     JSR GVA0D4_0
  570. .NXA5:  BTST    #1,CODEPREFS+3
  571.     BEQ.S   .NNCH
  572.     BSR NILCHECK
  573. .NNCH:  MOVEQ   #0,D4
  574.     CMP.L   D4,A1
  575.     BEQ.S   .16
  576.     MOVE.W  4(A1),D4        ; D4=READSIZE
  577.     BTST    #1,OFLAGS(A1)
  578.     BEQ.S   .17 ;16B            ; was 17! (caused uninit .spec)
  579.     MOVE.L  OPTRTYPE(A1),.SPEC
  580.     BRA.S   .17
  581. .16:    MOVE.L  D5,D4
  582. .16B:   MOVE.L  #1,.SPEC
  583. .17:
  584.  
  585.     CLR.B   .TDRF
  586.     CMP.W   #35,(A3)        ; "." (SLOW)
  587.     BEQ.S   .DD
  588.     CMP.W   #41,(A3)        ; "::"
  589.     BEQ.S   .DD
  590.     CMP.W   #29,(A3)        ; "["
  591.     BNE.S   .NDD
  592. .DD:    MOVE.B  #1,.TDRF        ; THROUGH-DEREF x.y.z
  593.     MOVE.B  D0,.ORIGD0
  594.     MOVE.W  #3,D0           ; TDR MODE
  595.     TST.L   D4
  596.     BEQ.S   .DD1
  597.     CMP.W   #4,D4
  598.     BNE ERROR40
  599.     BRA.S   .DD2
  600. .DD1:   ADDQ.W  #4,D0
  601. .DD2:   TST.W   D2
  602.     BNE ERROR40
  603.     BRA.S   .18
  604.  
  605. .NDD:
  606.     TST.W   D4
  607.     BNE.S   .NP
  608.     CMP.W   #2,D0
  609.     BEQ ERROR40
  610.     ADD.W   #4,D0           ; SET TO GET POINTER TO SUBSTRUCT
  611.     BRA.S   .18
  612. .NP:BSR .MOVEQ
  613. .18:CMP.L   #$10000,D0
  614.     BPL     .23
  615.     TST.L   D3
  616.     BPL.W   .40
  617.  
  618. ;; *** indexed version
  619.  
  620.     CMP.W   #ASSGN,(A3)
  621.     BEQ     .ENHANCE0
  622.     CMP.W   #11,2(A3)
  623.     BEQ     .EXPEXT0
  624. .E0_B0:
  625.     LSL.W   #2,D0
  626.     MOVE.L  .20(PC,D0.W),(A4)+
  627.     LSR.W   #2,D0
  628. .E0_B:
  629.     TST.W   .THE_FACTOR
  630.     BEQ     .E0_S0
  631.     MOVE.W  .THE_FACTOR,D1
  632.     LSL.W   #8,D1
  633.     LSL.W   #1,D1
  634.     OR.W    D1,-2(A4)
  635.     CLR.W   .THE_FACTOR
  636. .E0_S0:
  637.     BSR .EXTL
  638.     CMP.W   #2,D4
  639.     BEQ .21
  640.     BPL.S   .22
  641.     TST.W   D4
  642.     BEQ .DO         ; SKIP MOVE.X SET
  643.     BCLR    #5,-4(A4)
  644.     BRA .21
  645. .22:BCLR    #4,-4(A4)
  646.     BRA .21
  647. .THE_FACTOR:
  648.     DC.W    0
  649. ;; Enhance
  650. .ENHANCE0:
  651.     CMP.W   #2,D0
  652.     BPL     .E0_B0
  653.     ADDQ.L  #2,A3
  654.     MOVE.L  .E0_S(PC),(A4)+
  655.     BSR     EXP
  656.     MOVE.L  .E0_R(PC),(A4)+
  657.     MOVE.L  .20+8(PC),(A4)+
  658.     BRA     .E0_B
  659.  
  660. .E0_S:  MOVEM.L  D2/A0,-(A7)
  661. .E0_R:  MOVEM.L  (A7)+,D2/A0
  662. ;*-*
  663. ;; Codes
  664. .20:MOVE.W  0(A0,D2.L),D0       ; LONG
  665.     MOVE.W  0(A0,D2.L),D1
  666.     MOVE.W  D0,0(A0,D2.L)
  667.     MOVE.W  0(A0,D2.L),A0
  668.     LEA 0(A0,D2.L),A0
  669.     LEA 0(A0,D2.L),A0
  670.     LEA 0(A0,D2.L),A0
  671.     LEA 0(A0,D2.L),A0
  672. ;*-*
  673. ;; Extend
  674. .EXPEXT0:
  675.     CMP.W   #0,D0
  676.     BNE     .E0_B0
  677.     MOVE.W  (A3),D1
  678.     CMP.W   #7,D1
  679.     BMI     .E0_B0
  680.     CMP.W   #10,D1
  681.     BLE     .EXP_C0
  682.     CMP.W   #49,D1
  683.     BMI     .E0_B0
  684.     CMP.W   #50,D1
  685.     BLE     .EXP_C0
  686.     CMP.W   #IOFF+29,D1
  687.     BMI     .E0_B0
  688.     CMP.W   #IOFF+30,D1
  689.     BGT     .E0_B0
  690. .EXP_C0:
  691.     MOVE.W  (A3),2(A3)
  692.     MOVE.W  #51,(A3)
  693.  
  694.     LSL.W   #2,D0
  695.     MOVE.L  .20(PC,D0.W),(A4)+      ;
  696.     LSR.W   #2,D0
  697.  
  698.     TST.W   .THE_FACTOR
  699.     BEQ .EXP_C0_0
  700.     MOVE.W  .THE_FACTOR,D1
  701.     LSL.W   #8,D1
  702.     LSL.W   #1,D1
  703.     OR.W    D1,-2(A4)
  704. .EXP_C0_0:
  705.     BSR     .EXTL
  706.     CMP.W   #2,D4
  707.     BEQ.S   .EXP_C0_2
  708.     BPL.S   .EXP_C0_1
  709.     TST.W   D4
  710.     BEQ     ERROR0                  ; compiler shouldn't use this code, anyway..
  711.     BCLR    #5,-4(A4)               ; .B/.L size
  712.     BRA.S   .EXP_C0_2
  713. .EXP_C0_1:
  714.     BCLR    #4,-4(A4)               ; same here
  715. .EXP_C0_2:
  716.     MOVE.L  D4,-(A7)
  717.     MOVE.L  .EXP_ST2,(A4)+
  718.     BSR     EXP
  719.     MOVE.L  .EXP_RS2,(A4)+
  720.     MOVE.L  (A7)+,D4
  721.     MOVEQ   #2,D0
  722.     MOVEQ   #0,D2
  723.     BRA     .E0_B0
  724. .EXP_ST2:
  725.     MOVEM.L D2/A0,-(A7)
  726. .EXP_RS2:
  727.     MOVEM.L (A7)+,D2/A0
  728. ;*-*
  729. ;*-*
  730. ;; *** simple version
  731.  
  732. .23:CMP.W   #4,(A3)
  733.     BEQ     .ENHANCE1
  734.     CMP.W   #11,2(A3)
  735.     BEQ     .EXPEXT1
  736. .E1_B0:
  737.     cmp.w   #4,d0
  738.     bmi     .E1_B00
  739.     tst.w   D4
  740.     beq     .DO
  741.     bra     .21
  742. .E1_B00:
  743.     LSL.W   #1,D0
  744.     MOVE.W  .24(PC,D0.W),(A4)+
  745.     LSR.W   #1,D0
  746. .E1_B:
  747.     BSR .EXTL
  748.     CMP.W   #2,D4
  749.     BEQ.W   .21
  750.     BPL.S   .25
  751.     TST.W   D4
  752.     BEQ     .DO         ; SKIP MOVE.X SET
  753.     BCLR    #5,-2(A4)
  754.     BRA     .21
  755. .25:BCLR    #4,-2(A4)
  756.     BRA     .21
  757. ;; Enhance1 (:=)
  758. .ENHANCE1:
  759.     CMP.W   #2,D0
  760.     BPL     .E1_B0
  761.     ADDQ.L  #2,A3
  762.     MOVE.W  .E1_S(PC),(A4)+
  763. ;    BSR     SD0
  764.     BSR     EXP
  765. ;    BSR     RD0
  766.     MOVE.W  .E1_R(PC),(A4)+
  767.     MOVE.W  .24+4(PC),(A4)+
  768.     BRA     .E1_B
  769.  
  770. .E1_S:  MOVE.L  A0,-(A7)
  771. .E1_R:  MOVE.L  (A7)+,A0
  772. ;*-*
  773. ;; Codes
  774. .24:MOVE.W  (A0),D0         ; a:=b[]
  775.     MOVE.W  (A0),D1         ; a:=b+c[]
  776.     MOVE.W  D0,(A0)         ; a[]:=b...
  777.     MOVE.W  (A0),A0         ; a[][]?
  778.     LEA (A0),A0
  779.     LEA (A0),A0
  780.     LEA (A0),A0
  781.     LEA (A0),A0
  782. ;*-*
  783. ;; Extended (+=, -=, etc.)
  784. .EXPEXT1:
  785.     CMP.W   #0,D0
  786.     BNE     .E1_B0
  787.     MOVE.W  (A3),D1
  788.     CMP.W   #7,D1
  789.     BMI     .E1_B0
  790.     CMP.W   #10,D1
  791.     BLE     .EXP_C1
  792.     CMP.W   #49,D1
  793.     BMI     .E1_B0
  794.     CMP.W   #50,D1
  795.     BLE     .EXP_C1
  796.     CMP.W   #IOFF+29,D1
  797.     BMI     .E1_B0
  798.     CMP.W   #IOFF+30,D1
  799.     BGT     .E1_B0
  800. .EXP_C1:
  801.     MOVE.W  (A3),2(A3)
  802.     MOVE.W  #51,(A3)
  803.  
  804.     LSL.W   #1,D0
  805.     MOVE.W  .24(PC,D0.W),(A4)+      ;
  806.     LSR.W   #1,D0
  807.  
  808.     BSR     .EXTL
  809.     CMP.W   #2,D4
  810.     BEQ.S   .EXP_C1_2
  811.     BPL.S   .EXP_C1_1
  812.     TST.W   D4
  813.     BEQ     ERROR0                  ; compiler shouldn't use this code, anyway..
  814.     BCLR    #5,-2(A4)               ; .B/.L size
  815.     BRA.S   .EXP_C1_2
  816. .EXP_C1_1:
  817.     BCLR    #4,-2(A4)               ; same here
  818. .EXP_C1_2:
  819.     MOVE.L  D4,-(A7)
  820.     MOVE.W  .EXP_ST,(A4)+
  821.     BSR     EXP
  822.     MOVE.W  .EXP_RS,(A4)+
  823.     MOVE.L  (A7)+,D4
  824.     MOVEQ   #2,D0
  825.     MOVEQ   #0,d2
  826.     BRA     .E1_B0
  827. ;*-*
  828. ;*-*
  829. ;; *** relative(a0) version
  830.  
  831. .40:CMP.W   #ASSGN,(A3)
  832.     BEQ     .ENHANCE2
  833.  
  834.     CMP.W   #11,2(A3)
  835.     BEQ     .EXPEXT2
  836. .E2_B:
  837.     CMP.W   #4,D0
  838.     BMI     .E2_B0
  839.     CMP.W   #8,D3
  840.     BGT     .E2_B0
  841.     CMP.W   #-8,D3
  842.     BMI     .E2_B0
  843.     move.l  d0,-(a7)
  844.     tst.w   d3
  845.     smi     d0
  846.     eor.l   d0,d3
  847.     and.l   #$100,d0
  848.     or.l    #$5088,d0
  849.     move.w  d0,(a4)
  850.     and.l   #7,d3
  851.     lsl.w   #8,d3
  852.     lsl.w   #1,d3
  853.     or.w    d3,(a4)+
  854.     move.l  (a7)+,d0
  855.     tst.w   d4
  856.     beq     .DO
  857.     bra     .21
  858.  
  859. .E2_B0
  860.     LSL.W   #2,D0
  861.     MOVE.W  .42(PC,D0.W),(A4)+      ;
  862.     LSR.W   #2,D0
  863. .E2_B1:
  864.  
  865.     MOVE.W  D3,(A4)+
  866.     BSR .EXTL
  867.     CMP.W   #2,D4
  868.     BEQ     .21
  869.     BPL.S   .41
  870.     TST.W   D4
  871.     BEQ     .DO                     ; SKIP MOVE.X SET
  872.     BCLR    #5,-4(A4)               ; .B/.L size
  873.     BRA     .21
  874. .41:BCLR    #4,-4(A4)               ; same here
  875.     BRA     .21
  876.  
  877. ;; Enhanced (assigns in lists)
  878. .ENHANCE2:
  879.     CMP.W   #2,D0
  880.     BPL     .E2_B
  881.     ADDQ.L  #2,A3
  882.     MOVE.W  .E2_S(PC),(A4)+
  883.     MOVE.L  D3,-(A7)
  884.     BSR     EXP
  885.     MOVE.L  (A7)+,D3
  886.     MOVE.W  .E2_R(PC),(A4)+
  887.     MOVE.W  .42+8(PC),(A4)+
  888.     BRA     .E2_B1
  889.  
  890. .E2_S:  MOVE.L  A0,-(A7)
  891. .E2_R:  MOVE.L  (A7)+,A0
  892. ;*-*
  893. ;; Codes
  894. .42:MOVE.W  2(A0),D0
  895.     MOVE.W  2(A0),D1
  896.     MOVE.W  D0,2(A0)
  897.     MOVE.W  2(A0),A0
  898.     LEA 2(A0),A0
  899.     LEA 2(A0),A0
  900.     LEA 2(A0),A0
  901.     LEA 2(A0),A0
  902. ;*-*
  903. ;; Extended (+=, -=, etc.)
  904. .EXPEXT2:
  905.     CMP.W   #0,D0
  906.     BNE     .E2_B
  907.     MOVE.W  (A3),D1
  908.     CMP.W   #7,D1
  909.     BMI     .E2_B
  910.     CMP.W   #10,D1
  911.     BLE     .EXP_C2
  912.     CMP.W   #49,D1
  913.     BMI     .E2_B
  914.     CMP.W   #50,D1
  915.     BLE     .EXP_C2
  916.     CMP.W   #IOFF+29,D1
  917.     BMI     .E2_B
  918.     CMP.W   #IOFF+30,D1
  919.     BGT     .E2_B
  920. .EXP_C2:
  921.     MOVE.W  (A3),2(A3)
  922.     MOVE.W  #51,(A3)
  923.  
  924.     LSL.W   #2,D0
  925.     MOVE.W  .42(PC,D0.W),(A4)+      ;
  926.     LSR.W   #2,D0
  927.  
  928.     MOVE.W  D3,(A4)+
  929.     BSR     .EXTL
  930.     CMP.W   #2,D4
  931.     BEQ.S   .EXP_C2_2
  932.     BPL.S   .EXP_C2_1
  933.     TST.W   D4
  934.     BEQ     ERROR0                  ; compiler shouldn't use this code, anyway..
  935.     BCLR    #5,-4(A4)               ; .B/.L size
  936.     BRA.S   .EXP_C2_2
  937. .EXP_C2_1:
  938.     BCLR    #4,-4(A4)               ; same here
  939. .EXP_C2_2:
  940.     MOVem.L  D3/D4,-(A7)
  941.     MOVE.W  .EXP_ST,(A4)+
  942.     BSR     EXP
  943.     MOVE.W  .EXP_RS,(A4)+
  944.     MOVEQ   #2,D0
  945.     MOVEM.L (A7)+,D3/D4
  946.     moveq   #0,d2
  947.     BRA     .E2_B
  948.  
  949. .EXP_ST:
  950.     MOVE.L  A0,-(A7)
  951. .EXP_RS:
  952.     MOVE.L  (A7)+,A0
  953. ;*-*
  954. ;*-*
  955.  
  956. ;; LAST PARTS:
  957.  
  958. .DO:SUBQ.W  #4,D0           ; DO ADDITIONAL MOVE
  959.     TST.B   .TDRF
  960.     BNE     .DLOOP          ; try to optimize
  961.     cmp.w   #1,d0
  962.     ble     .doopti
  963. .do21p:
  964.     LSL.W   #1,D0
  965.     move.l  a0,-(a7)
  966.     lea     .MA0(PC),a0
  967.     MOVE.W  0(a0,D0.W),(A4)+
  968.     move.l  (a7)+,a0
  969.     LSR.W   #1,D0
  970.  
  971. .21:    TST.B   .TDRF
  972.     BNE     .DLOOP
  973.     MOVEQ   #1,D1           ; OUT!
  974.     BSR GENID
  975.     BRA XIT
  976.  
  977. .doopti:
  978.     move.w  -2(A4),d1
  979.     and.w   #$FFF8,d1
  980.     cmp.w   #$2040,d1
  981.     beq     .dodo2
  982.     cmp.w   #$206d,-4(a4)
  983.     beq     .dodo1
  984.     cmp.w   #$206c,-4(a4)
  985.     beq     .dodo1
  986.     bra     .do21p
  987. .dodo1:
  988.     subq.l  #4,a4
  989.     move.l  a4,LAST_CMD_ADR
  990.     addq.l  #4,a4
  991.     move.w  -4(a4),d1
  992.     and.w   #$F,D1
  993.     or.w    #$2020,d1
  994.     move.w  d1,-4(a4)
  995.     lsl.w   #8,d0
  996.     lsl.w   #1,d0
  997.     or.w    d0,-4(a4)
  998.     lsr.w   #8,d0
  999.     lsr.w   #1,d0
  1000.     bra     .21
  1001. .dodo2:
  1002.     subq.l  #2,a4
  1003.     move.l  a4,LAST_CMD_ADR
  1004.     addq.l  #2,a4
  1005.     move.w  -2(a4),d1
  1006.     and.w   #$FFBF,D1
  1007.     lsl.w   #8,d0
  1008.     lsl.w   #1,d0
  1009.     move.w  d1,-2(a4)
  1010.     or.w    d0,-2(a4)
  1011.     lsr.w   #8,d0
  1012.     lsr.w   #1,d0
  1013.     bra     .21
  1014.  
  1015.  
  1016. .DLOOP: MOVE.W  .KEEPD5,D5
  1017.     EXT.L   D5
  1018.     MOVE.W  (A3)+,D1
  1019.     MOVE.B  .ORIGD0,D0
  1020.     BRA.W   .DREFL
  1021.  
  1022. .SPEC:  DC.L    0           ; 2 LONGWORDS <-> SAVE
  1023. .TDRF:  DC.B    0
  1024. .ORIGD0:DC.B    0
  1025. .KEEPD5:DC.W    0
  1026. .SAVA0: MOVE.L  A0,-(A7)
  1027. .RETA0: MOVE.L  (A7)+,A0
  1028. .OPTID2:MOVE.L  2(A5),D2
  1029.  
  1030. ;*-*
  1031. ;; CODES:
  1032.  
  1033. .19:MOVEQ   #0,D0
  1034.     MOVEQ   #0,D1
  1035. .19A:
  1036.     EXT.W   D0
  1037.     EXT.W   D1
  1038. .19B:
  1039.     EXT.L   D0
  1040.     EXT.L   D1
  1041. .19C:
  1042.     EXTB.L  D0
  1043.     EXTB.L  D1
  1044.  
  1045. .MA0:
  1046.     MOVE.L  A0,D0
  1047.     MOVE.L  A0,D1
  1048. .26:MOVE.L  D0,-(A7)
  1049. .27:MOVE.L  (A7)+,D2
  1050.     EXG.L   D0,D2
  1051. .28:MULU    #1,D2
  1052. .29:LSL.L   #1,D2
  1053.     LSL.L   #2,D2
  1054.     LSL.L   #3,D2
  1055.     LSL.L   #4,D2
  1056. .30:    MOVE.L  D0,D2
  1057.  
  1058.  
  1059. .MOVEQ: CMP.W   #4,D4           ; see if we need a "moveq #0,D0/D1"
  1060.     BEQ.S   .MOVEX
  1061.     CMP.W   #2,D0
  1062.     BPL.S   .MOVEX
  1063.     CMP.W   #2,D4
  1064.     BEQ.S   .MOVEX
  1065.     LSL.L   #1,D0
  1066.     MOVE.W  .19(PC,D0.W),(A4)+
  1067.     LSR.L   #1,D0
  1068. .MOVEX: RTS
  1069.  
  1070. .EXTL:  CMP.W   #4,D4           ; see if we need a "EXT.L D0/D1"
  1071.     BEQ.S   .EXTX
  1072.     CMP.W   #2,D0
  1073.     BPL.S   .EXTX
  1074.     CMP.W   #1,D4
  1075.     BEQ.S   .EXTX
  1076.     LSL.L   #1,D0
  1077.     MOVE.W  .19B(PC,D0.W),(A4)+
  1078.     LSR.L   #1,D0
  1079. .EXTX:  RTS
  1080.  
  1081. .EXTBL:
  1082.     CMP.W   #1,ECPU
  1083.     BPL     .EXTBL_2
  1084.     LSL.L   #1,D0
  1085.     MOVE.W  .19A(PC,D0),(A4)+
  1086.     MOVE.W  .19B(PC,D0),(A4)+
  1087.     LSR.L   #1,D0
  1088.     RTS
  1089. .EXTBL_2:
  1090.     LSL.L   #1,D0
  1091.     MOVE.W  .19C(PC,D0),(A4)+
  1092.     LSR.L   #1,D0
  1093.     RTS
  1094.  
  1095. .EADDRMETHOD2:
  1096.     MOVE.L  (A3),A6
  1097.     MOVE.L  OASCII(A6),(A3)
  1098.     MOVE.W  #42,-(A3)
  1099. .EADDRMETHOD:
  1100.     MOVE.L  A0,METHODIDENT
  1101.     CLR.L   METHODSPEC
  1102.     TST.B   .TDRF
  1103.     BEQ.S   .NMS
  1104.     MOVE.L  .SPEC,METHODSPEC
  1105. .NMS:   MOVEM.L (A7)+,D3-D5/A1
  1106.     BSR SD0
  1107.     BSR EXPCALLMETHOD
  1108.     BSR RD0
  1109.     MOVEQ   #1,D5
  1110.     ADDQ.L  #4,A7           ; FLUSH RTS
  1111.     BRA EXPLOOP
  1112.  
  1113.  
  1114. PLX:    CMP.W   #35,D1          ; p++  p--
  1115.     BPL PLB
  1116.     SUBQ.L  #2,A3
  1117.     MOVE.L  (A0),D5         ; D5=OBJSIZE
  1118.     CMP.L   #MAXOBJSIZE,D5
  1119.     BMI.S   .NOBJ
  1120.     MOVE.L  D5,A6
  1121.     MOVE.W  4(A6),D5
  1122.     EXT.L   D5
  1123. .NOBJ:  MOVEQ   #4,D6           ; D6=NOPTR
  1124.     BRA.S   PLS
  1125.  
  1126. PL: MOVEQ   #0,D6           ; D6=PTR
  1127.     MOVEQ   #4,D5           ; D5=4(SIZE)
  1128.     CMP.W   #IDENT,(A3)+        ; ^p  ^p++  ^p--
  1129.     BNE ERROR6
  1130.     MOVE.L  (A3)+,A0        ; A0=IDENT
  1131.     TST.B   4(A0)
  1132.     BEQ ERROR22
  1133.     CMP.B   #LAB,4(A0)
  1134.     BEQ ERROR6
  1135. PLS:    BSR.W   PP
  1136.  
  1137.     MOVEQ   #2,D1
  1138.     BSR GENID
  1139.  
  1140. .6: TST.W   D6
  1141.     BEQ.S   .6B
  1142.     CMP.W   #1,EXPRECC
  1143.     BNE.S   .6B
  1144.     TST.W   EXPSTAT
  1145.     BNE .SPTR
  1146. .6B:
  1147.     TST.L   D6
  1148.     BNE.S   .6BB
  1149.     MOVE.W  .2(PC),(A4)+
  1150.     BRA.S   .6BBB
  1151. .6BB:   MOVE.W  D0,D3
  1152.     LSL.W   #2,D3
  1153.     MOVE.W  .2B(PC,D3.W),(A4)+
  1154. .6BBB:  BSR GVA0D3_0
  1155.  
  1156.     MOVE.W  D0,D3
  1157.     LSL.W   #1,D3
  1158.     TST.L   D6
  1159.     BNE.S   .SPTR
  1160.     MOVE.W  .3(PC,D3.W),(A4)+
  1161. .SPTR:
  1162.     MOVEQ   #1,D1
  1163.     BSR GENID
  1164.  
  1165. .7: BRA XIT
  1166. .2: MOVE.L  2(A5),A0
  1167. .2B:    MOVE.L  2(A5),D0
  1168.     MOVE.L  2(A5),D1
  1169. .3: MOVE.L  (A0),D0
  1170.     MOVE.L  (A0),D1
  1171.     MOVE.L  D0,(A0)
  1172.  
  1173. PP: MOVEQ   #0,D2           ; D2 (1=++, 2=--, 0=NIX)
  1174.     MOVE.W  (A3),D1
  1175.     CMP.W   #33,D1
  1176.     BNE.S   .P1
  1177.     MOVEQ   #1,D2
  1178.     ADDQ.L  #2,A3
  1179. .P2:    RTS
  1180. .P1:    CMP.W   #34,D1
  1181.     BNE.S   .P2
  1182.     MOVEQ   #2,D2
  1183.     ADDQ.L  #2,A3
  1184.     RTS
  1185. GEND2:  MOVEQ   #-1,D3
  1186.     CMP.L   #30000,D1       ; VALUE IN D1, GENCODE FOR D2 (ONLY POSITIVE)
  1187.     BPL.S   .G1
  1188.     TST.L   D1
  1189.     BEQ.S   .G9
  1190.     MOVE.L  D1,D3
  1191.     RTS
  1192. .G9:    ADD.L   #$10000,D0
  1193.     RTS
  1194. .G1:    MOVE.W  .G3(PC),(A4)+
  1195.     MOVE.L  D1,(A4)+
  1196.     RTS
  1197. .G3:    MOVE.L  #0,D2
  1198. GENID:  CMP.L   D1,D2
  1199.     BEQ.S   .G4
  1200.     RTS
  1201. .G4:    SUBQ.L  #1,D1
  1202.     MOVE.W  D5,D4           ; d5=objsize, d4=trash
  1203.     EXT.L   D4
  1204.     CMP.L   #9,D4
  1205.     BPL .G5
  1206.     CMP.W   #8,D4
  1207.     BNE.S   .G8
  1208.     MOVEQ   #0,D4
  1209. .G8:    LSL.L   #2,D1
  1210.     MOVE.W  .G6(PC,D1.L),(A4)+
  1211.     LSL.W   #1,D4
  1212.     OR.B    D4,-2(A4)
  1213.     BRA GVA0D1_0
  1214. .G6:    ADDQ.L  #8,2(A5)
  1215.     SUBQ.L  #8,2(A5)
  1216. .G7:    ADD.L   #1,2(A5)
  1217.     SUB.L   #1,2(A5)
  1218. .G5:    LSL.L   #3,D1
  1219.     MOVE.W  .G7(PC,D1.W),(A4)+
  1220.     BSR GVA0D1_0
  1221.     BTST    #3,5(A0)
  1222.     BEQ.S   .GXX
  1223.     MOVE.L  D4,(A4)+
  1224.     RTS
  1225. .GXX:   MOVE.W  -(A4),D1
  1226.     MOVE.L  D4,(A4)+
  1227.     MOVE.W  D1,(A4)+
  1228.     RTS
  1229. GENADD: TST.L   D1          ; value in d1
  1230.     BNE.S   .GA1
  1231.     RTS
  1232. .GA1:   CMP.L   #9,D1
  1233.     BPL.S   .GA5
  1234.     CMP.W   #8,D1
  1235.     BNE.S   .GA8
  1236.     MOVEQ   #0,D1
  1237. .GA8:   MOVE.W  .GA6(PC),(A4)+
  1238.     LSL.W   #1,D1
  1239.     OR.B    D1,-2(A4)
  1240.     RTS
  1241. .GA5:   MOVE.W  .GA7(PC),(A4)+
  1242.     MOVE.L  D1,(A4)+
  1243.     RTS
  1244. .GA6:   ADDQ.L  #8,D2
  1245. .GA7:   ADD.L   #1,D2
  1246.  
  1247.  
  1248. XIT:    MOVEM.L (A7)+,D3-D5/A1
  1249.     RTS
  1250.  
  1251. ;*-*
  1252. ;; NilCheck
  1253. ; WERE NOT TO DISTURB ANY REGS, NOT EVEN IN GENERATED CODE (D1?)
  1254. ; (IN CODE): PTR TO CHECK IS IN A0
  1255.  
  1256. NILCHECK:
  1257.     MOVEM.L D0/D1/A0/A6,-(A7)
  1258.     MOVE.L  .CH(PC),(A4)+
  1259.     MOVE.L  A4,A6           ; A6=BRANCH BACKPATCH
  1260.     MOVE.L  .ARGS(PC),(A4)+
  1261.     MOVE.L  .ARGS+4(PC),(A4)+
  1262.     MOVE.W  LINENUM(PC),D0
  1263.     ADDQ.W  #1,D0
  1264.     MOVE.W  D0,(A4)+
  1265.     MOVEQ   #90+10,D0       ; D0=FASTNEW
  1266.     MOVE.B  #-1,EFUNCBYTE+90    ; fastnew=91
  1267.     MOVE.L  .4(PC),(A4)+        ; GEN CALL
  1268.     TSTMOD
  1269.     BNE.S   .MOD
  1270.     MOVE.W  .5(PC),NEWOP
  1271.     BSR ADDBRANCH
  1272.     BRA.S   .CC
  1273. .MOD:   SUBQ.L  #4,A4
  1274.     MOVE.W  .5(PC),(A4)+
  1275.     BSR ADDBRANCHRELOC
  1276.     MOVE.W  D0,-2(A4)
  1277. .CC:    MOVE.W  .SB(PC),(A4)+
  1278.     MOVE.L  A4,D0
  1279.     SUB.L   A6,D0
  1280.     MOVE.B  D0,-(A6)
  1281.     MOVEM.L (A7)+,D0/D1/A0/A6
  1282.     RTS
  1283. .CH:    MOVE.L  A0,D1
  1284.     BNE.S   .CH
  1285. .ARGS:  MOVE.L  #"NIL",-(A7)
  1286.     PEA $10.W
  1287. .SB:    ADDQ.L  #8,A7
  1288. .5: JSR .CH
  1289. .4: BSR.W   .CH
  1290. ;*-*
  1291. OBJ_EXECBASE:
  1292.     DC.L    0
  1293. VAR_EXECBASE:
  1294.     DC.L    0
  1295. OBJ_DOSBASE:
  1296.     DC.L    0
  1297. VAR_DOSBASE:
  1298.     DC.L    0
  1299. OBJ_INTUIBASE:
  1300.     DC.L    0
  1301. VAR_INTUIBASE:
  1302.     DC.L    0
  1303. OBJ_GFXBASE:
  1304.     DC.L    0
  1305. VAR_GFXBASE:
  1306.     DC.L    0
  1307. OBJ_RASTPORT:
  1308.     DC.L    0
  1309. VAR_RASTPORT:
  1310.     DC.L    0
  1311. OBJ_WBMESSAGE:
  1312.     DC.L    0
  1313. VAR_WBMESSAGE:
  1314.     DC.L    0
  1315. LAST_CMD_ADR:
  1316.     DC.L    0
  1317. ;*-*
  1318. ;; Expression main
  1319. EXPRECC:  DC.W    0       ; RECURSION DEPTH OF EXP()
  1320. ;; Main expression loop
  1321. EXP:              ; GENERATES EXP FOR D0
  1322.     BCLR    #2,ICODEPREFS+3
  1323.     MOVE.L  #0,LASTVAR
  1324.     MOVEM.L D3-D5/A1/A2,-(A7)   ; WE DO HEAVY RECURSION
  1325.     MOVE.W  FLTFLAG(PC),-(A7)
  1326.     CLR.W   FLTFLAG
  1327.     ADDQ.W  #1,EXPRECC
  1328.     MOVEQ   #6,D4           ;
  1329.     MOVEQ   #-1,D5          ; MUST BE = EXPBUT
  1330.     LEA EXPMOVE(PC),A1      ;
  1331.  
  1332.     CMP.W   #51,(A3)
  1333.     BNE     EXPLOOP
  1334.     MOVEQ   #1,D5           ; variable
  1335.     ADDQ.L  #2,A3
  1336.  
  1337. EXPLOOP:
  1338.     MOVE.W  (A3)+,D0
  1339.     BEQ EXPOUT
  1340.     CMP.W   #COM,D0
  1341.     BEQ EXPOUT
  1342.     CMP.W   #7,D0
  1343.     BPL EXPOPERATOR
  1344. EXPBACK:
  1345.     CMP.W   #IDENT,D0
  1346.     BEQ EXPVAR
  1347.     CMP.W   #STR,D0
  1348.     BEQ EXPSTRING
  1349.     CMP.W   #VALUE,D0
  1350.     BEQ EXPVALUE
  1351.     CMP.W   #11,D0
  1352.     BPL EXPCOMPARATOR
  1353. EXPBACK2:
  1354.     CMP.W   #17,D0
  1355.     BEQ EXPREC
  1356.     CMP.W   #55,D0
  1357.     BEQ EXPLOOP
  1358.     CMP.W   #LIBC,D0
  1359.     BEQ EXPLIBCALL
  1360.     CMP.W   #22,D0
  1361.     BEQ EXPEFUNC
  1362.     CMP.W   #23,D0
  1363.     BEQ CURLY
  1364.     CMP.W   #29,D0
  1365.     BEQ EXPIMMLIST
  1366.     CMP.W   #18,D0
  1367.     BEQ EXPOUT
  1368.     CMP.W   #30,D0
  1369.     BEQ EXPOUT
  1370.     CMP.W   #53,D0
  1371.     BEQ     EXPSWAP
  1372.     CMP.W   #32,D0
  1373.     BEQ.W   EXPPTR
  1374.     CMP.W   #IOFF+29,D0
  1375.     BPL EXPLOG
  1376. ANDORNOTBACK:
  1377.     CMP.W   #19,D0
  1378.     BEQ EXPOUT
  1379.     CMP.W   #IOFF+2,D0
  1380.     BEQ EXPIF
  1381.     CMP.W   #IOFF+50,D0
  1382.     BEQ EXPSIZEOF
  1383.     CMP.W   #36,D0
  1384.     BEQ EXPQUOTE
  1385.     CMP.W   #37,D0
  1386.     BEQ EXPFLT
  1387.     CMP.W   #IOFF+63,D0
  1388.     BEQ EXPNEW
  1389.     CMP.W   #IOFF+55,D0
  1390.     BEQ EXPBUT
  1391.     CMP.W   #43,D0
  1392.     BEQ EXPFLOATVAL
  1393.     CMP.W   #40,D0
  1394.     BEQ EXPUNIFY
  1395.     CMP.W   #IOFF+66,D0
  1396.     BEQ EXPSUPER
  1397.     CMP.W   #46,D0
  1398.     BEQ EXPOUT
  1399.     CMP.W   #49,D0
  1400.     BEQ EXPSHIFT
  1401.     CMP.W   #50,D0
  1402.     BEQ EXPSHIFT
  1403.     CMP.W   #54,D0
  1404.     BEQ EXPLIBFUNC
  1405.     CMP.W   #52,D0
  1406.     BEQ EXPQMARK            ; ?
  1407.     
  1408.     CMP.W   #IOFF,D0
  1409.     BMI ERROR0
  1410. EXPOUT:
  1411.     TST.W   FLTFLAG
  1412.     BEQ .0
  1413.     BTST    #1,CODEPREFS
  1414.     BEQ .0
  1415.     CMP.L   #EXPCMP,A1
  1416.     BEQ .0
  1417.     move.l  a4,LAST_CMD_ADR
  1418.     MOVE.L  .C0,(A4)+
  1419. .0:
  1420.     SUBQ.L  #2,A3
  1421.     CMP.W   #1,D5
  1422.     BNE ERROR0
  1423.     SUBQ.W  #1,EXPRECC
  1424.     MOVE.W  (A7)+,FLTFLAG
  1425.     MOVEM.L (A7)+,D3-D5/A1/A2
  1426.     RTS
  1427. .C0:FMOVE.S FP0,D0
  1428. ;*-*
  1429. ;; "^"
  1430. EXPPTR:
  1431.     CLR.L   LAST_CMD_ADR
  1432.     CMP.W   #1,D5
  1433.     BEQ ERROR0
  1434.     MOVEQ   #1,D0
  1435.     SUBQ.L  #2,A3
  1436.     BSR EADDRESSMODI
  1437.     CMP.W   #-1,D5
  1438.     BEQ.S   .1
  1439.     BSR CLOSEEXP
  1440. .1: MOVEQ   #1,D5
  1441.     BRA EXPLOOP
  1442. ;*-*
  1443. ;; BUT
  1444. EXPBUT:
  1445.     CMP.W   #1,D5
  1446.     BNE ERROR0
  1447. ;   MOVE.W  (A3),D0
  1448. ;   CMP.W   #IOFF+29,D0
  1449. ;   BEQ.S   .A
  1450. ;   CMP.W   #IOFF+30,D0
  1451. ;   BEQ.S   .O
  1452.     MOVEQ   #6,D4           ;
  1453.     MOVEQ   #-1,D5          ; = START OF EXP
  1454.     LEA EXPMOVE(PC),A1      ;
  1455.     BRA EXPLOOP
  1456. ;.A:    MOVE.W  .EQ(PC),D0
  1457. ;   BRA.S   .S
  1458. ;.O:    MOVE.W  .NE(PC),D0
  1459. ;.S:    ADDQ.L  #2,A3
  1460. ;   MOVE.W  .TST(PC),(A4)+
  1461. ;   MOVE.W  D0,(A4)+
  1462. ;   MOVE.L  A4,A0
  1463. ;   CLR.W   (A4)+
  1464. ;   MOVE.L  A0,-(A7)
  1465. ;   BSR.W   EXP
  1466. ;   MOVE.L  (A7)+,A0
  1467. ;   MOVE.L  A4,D0
  1468. ;   SUB.L   A0,D0
  1469. ;   MOVE.W  D0,(A0)
  1470. ;   MOVEQ   #1,D5
  1471. ;   BRA EXPLOOP
  1472. ;.EQ:   BEQ.W   .A
  1473. ;.NE:   BNE.W   .A
  1474. ;.TST:  TST.L   D0
  1475.  
  1476. ;*-*
  1477. ;; Macro section
  1478. ; RETURNS: 0=LIST, 1,2,4=SIMPLE, PTR=OBJECT
  1479.  
  1480. GTYPE:  MACRO               ; \1=TRASH.AX, \2=RESULT.DX
  1481.     MOVEQ   #0,\2
  1482.     MOVE.L  (A3)+,\1
  1483.     ADD.L   A3,\1
  1484.     SUBQ.L  #4,\1
  1485.     CMP.W   #19,(\1)+
  1486.     BNE.S   .GTOUT
  1487.     MOVE.W  (\1)+,\2
  1488.     CMP.W   #IOFF+20,\2
  1489.     BMI.S   .GT1
  1490.     CMP.W   #IOFF+23,\2
  1491.     BPL.S   .GT1
  1492.     SUB.W   #IOFF+20,\2
  1493.     MOVE.B  .GTTAB(PC,\2.W),\2
  1494.     EXT.W   \2
  1495.     EXT.L   \2
  1496.     BRA.S   .GTOUT
  1497. .GT1:   CMP.W   #31,\2
  1498.     BNE.S   .GTER
  1499.     MOVE.L  (\1),\2
  1500.     BRA.S   .GTOUT
  1501. .GTTAB: DC.B    4,2,1,0
  1502. .GTER:  MOVE.L  \1,A3
  1503.     BRA ERROR0
  1504. .GTOUT:
  1505.     ENDM
  1506.  
  1507. GEAT:   MACRO               ; \1=THRASH.DX
  1508.     CMP.W   #19,(A3)
  1509.     BNE.S   .GTDONE
  1510.     ADDQ.L  #2,A3
  1511.     MOVE.W  (A3)+,\1
  1512.     CMP.W   #IOFF+20,\1
  1513.     BMI.S   .GT9
  1514.     CMP.W   #IOFF+23,\1
  1515.     BMI.S   .GTDONE
  1516. .GT9:   CMP.W   #31,\1
  1517.     BNE ERROR0
  1518.     ADDQ.L  #4,A3
  1519. .GTDONE:
  1520.     ENDM
  1521.  
  1522. MOVED0FP0: MACRO
  1523.     tst.w   FLTFLAG
  1524.     beq     .NOMOVE
  1525.     btst    #1,CODEPREFS
  1526.     beq     .NOMOVE
  1527.     move.l  A4,LAST_CMD_ADR
  1528.     MOVE.L  .D0FP0(pc),(a4)+
  1529.     bra     .NOMOVE
  1530. .D0FP0:
  1531.     fmove.s d0,fp0
  1532. .NOMOVE:
  1533.     ENDM
  1534. ;*-*
  1535. ;; SUPER
  1536. EXPSUPER:
  1537.     CLR.L   LAST_CMD_ADR
  1538.     CMP.W   #1,D5
  1539.     BEQ ERROR0
  1540.     BSR SD0
  1541.     BSR SUPEREXP
  1542.     BSR RD0
  1543.     MOVEQ   #1,D5
  1544.     BRA EXPLOOP
  1545. SUPEREXP:
  1546.     CMP.W   #IDENT,(A3)+
  1547.     BNE ERROR0
  1548.     MOVE.L  (A3)+,A0        ; A0=IDENT
  1549.     MOVE.L  A0,METHODIDENT
  1550.     TST.B   4(A0)
  1551.     BEQ ERROR22
  1552.     CMP.B   #LAB,4(A0)
  1553.     BEQ ERROR6
  1554.     MOVE.L  (A0),A6         ; A6=OBJ
  1555.     CMPA.L  #MAXOBJSIZE,A6
  1556.     BMI.W   ERROR33
  1557.     MOVE.L  OSUPER(A6),D0
  1558.     BEQ ERROR50
  1559.     MOVE.L  D0,A6           ; A6=SUPER
  1560.     TST.W   ODEL(A6)
  1561.     BEQ ERROR40
  1562.     CMP.W   #35,(A3)+
  1563.     BNE ERROR0
  1564.     MOVE.L  A6,METHODFREEZ
  1565.     CLR.L   METHODSPEC
  1566.     BSR EXPCALLMETHOD       ; call SUPER-METHOD
  1567.     MOVE.L  METHODFREEZ(PC),A6
  1568.     CLR.L   METHODFREEZ
  1569.     RTS
  1570. ;*-*
  1571. ;; NEW
  1572. EXPNEW:
  1573.     CLR.L   LAST_CMD_ADR
  1574.     CMP.W   #1,D5
  1575.     BEQ ERROR0
  1576.     BSR.W   SD0
  1577.     MOVEQ   #0,D0
  1578.     BSR.S   NEWEXP
  1579.     BSR.W   RD0
  1580.     MOVEQ   #1,D5
  1581.     BRA EXPLOOP
  1582. NEWEXP:
  1583.     MOVE.W  D0,-(A7)
  1584. .NLOOP: CMP.W   #IDENT,(A3)+
  1585.     BNE .NL
  1586.     MOVE.L  (A3)+,A0        ; A0=IDENT
  1587.     TST.B   4(A0)
  1588.     BEQ ERROR22
  1589.     CMP.B   #LAB,4(A0)
  1590.     BEQ ERROR6
  1591.  
  1592.     MOVE.W  #-1,.ISM
  1593.  
  1594.     MOVE.L  (A0),D0         ; D0=OBJECTSIZE
  1595.     SUB.L   A6,A6           ; A6=OBJECT | NIL
  1596.     CMP.L   #5,D0
  1597.     BMI.S   .0
  1598.     MOVE.L  D0,A6
  1599.     MOVE.W  OSIZE(A6),D0
  1600.     EXT.L   D0
  1601.  
  1602.     CMP.W   #35,(A3)
  1603.     BNE.S   .0
  1604.     CMP.W   #39,2(A3)
  1605.     BNE .0
  1606.     ADDQ.L  #4,A3
  1607.     MOVE.L  A1,-(A7)
  1608.     MOVE.L  (A3)+,A1        ; A1=MEMBER
  1609.     BSR FINDMEMBER      ; D1=TRASH,a1=first->REAL,a6=obj
  1610.     MOVE.W  OOFF(A1),.ISM
  1611.     BTST    #1,OFLAGS(A1)
  1612.     BEQ ERROR40
  1613.     CMP.W   #4,OSIZE(A1)
  1614.     BNE ERROR40
  1615.     SUB.L   A6,A6
  1616.     MOVE.L  OPTRTYPE(A1),D0
  1617.     BEQ.W   ERROR40
  1618.     BMI.S   .OO
  1619.     CMP.L   #5,D0
  1620.     BMI.S   .CON
  1621. .OO:    MOVE.L  D0,A6
  1622.     MOVE.W  OSIZE(A6),D0
  1623.     EXT.L   D0
  1624. .CON:   MOVE.L  (A7)+,A1
  1625. .0:
  1626.     CMP.W   #29,(A3)
  1627.     BNE.S   .1
  1628.     ADDQ.L  #6,A3           ; ALSO SKIP ]OFFSET
  1629.     MOVEM.L A0/D0/A6,-(A7)      ; NEW p[exp]
  1630.     BSR EXP
  1631.     MOVEM.L (A7)+,A0/D0/A6
  1632.     CLR.W   .SINGL
  1633.     CMP.W   #30,(A3)+
  1634.     BNE ERROR34
  1635.  
  1636.     CMP.W   #1,D0
  1637.     BEQ.S   .NM
  1638.     CMP.W   #2,D0
  1639.     BNE.S   .N1
  1640.     MOVE.W  .LSL1(PC),(A4)+
  1641.     BRA.S   .NM
  1642. .N1:    CMP.W   #4,D0
  1643.     BNE.S   .N2
  1644.     MOVE.W  .LSL2(PC),(A4)+
  1645.     BRA.S   .NM
  1646. .N2:    MOVE.W  .M(PC),(A4)+
  1647.     MOVE.W  D0,(A4)+
  1648.  
  1649. .NM:    MOVE.W  .S1(PC),(A4)+
  1650.     BRA.S   .2
  1651.  
  1652. .1: MOVE.W  .S2(PC),(A4)+       ; just NEW p
  1653.     MOVE.W  D0,(A4)+
  1654.     MOVE.W  #1,.SINGL
  1655.  
  1656. .2: MOVE.L  D0,D1           ; D1=OBJECTSIZE NOW
  1657.     BSR .GNEW
  1658.     MOVE.W  .A(PC),(A4)+
  1659.  
  1660.     MOVE.W  .ISM(PC),D1
  1661.     BPL.W   .A0O
  1662.  
  1663.     MOVE.W  .ST(PC),(A4)+
  1664.     BSR GVA0D0_9
  1665.     BRA.S   .NA0O
  1666.  
  1667. .A0O:   MOVE.W  .ST2(PC),(A4)+
  1668.     BSR GVA0D0_0
  1669.     MOVE.W  .ST3(PC),(A4)+
  1670.     MOVE.W  D1,(A4)+
  1671. .NA0O:
  1672.     TST.W   .SINGL
  1673.     BEQ.W   .3
  1674.  
  1675.     MOVE.L  A6,D0
  1676.     BEQ.W   .4B
  1677.     TST.W   ODEL(A6)
  1678.     BEQ.W   .4B
  1679.     MOVE.L  A0,METHODIDENT
  1680.     GETM    A0
  1681.     MOVE.L  OACC(A6),(A0)
  1682.     MOVE.L  A0,OACC(A6)
  1683.     ADDQ.L  #4,A0
  1684.     MOVE.W  .GOBJ(PC),(A4)+
  1685.     TST.W   ODELOFF(A6)
  1686.     BNE.S   .G1
  1687.     MOVE.W  .GOBJ2(PC),(A4)+
  1688.     MOVE.L  A4,(A0)+
  1689.     CLR.W   (A4)+
  1690.     BRA.S   .G2
  1691. .G1:    MOVE.W  .GOBJ3(PC),(A4)+
  1692.     MOVE.L  A4,(A0)+
  1693.     CLR.W   (A4)+
  1694.     MOVE.W  ODELOFF(A6),(A4)+
  1695. .G2:    CLR.W   (A0)+
  1696.     DONEM   A0
  1697.     CMP.W   #35,(A3)
  1698.     BNE.S   .4B
  1699.     ADDQ.L  #2,A3
  1700.  
  1701.     CLR.L   METHODSPEC
  1702.     TST.W   .ISM
  1703.     BMI.S   .NMS
  1704.     MOVE.L  A6,METHODSPEC
  1705. .NMS:
  1706.     MOVE.L  METHODIDENT(PC),-(A7)
  1707.     BSR EXPCALLMETHOD       ; call constructor on memory
  1708.     MOVE.L  (A7)+,METHODIDENT
  1709.     TST.W   (A7)
  1710.     BNE.S   .4B
  1711.     MOVE.W  .MV(PC),(A4)+
  1712.     MOVE.L  METHODIDENT(PC),A0
  1713.     BSR GVA0D0_0
  1714.     BRA.S   .4B
  1715. .3:
  1716.     MOVE.L  A6,D0
  1717.     BEQ.S   .4B
  1718.     TST.W   ODEL(A6)
  1719.     BNE ERROR40
  1720. .4B:
  1721. .XXXX:  TST.W   (A7)
  1722.     BEQ.S   .X1
  1723.     CMP.W   #COM,(A3)+
  1724.     BEQ .NLOOP
  1725.     SUBQ.L  #2,A3
  1726. .X1:    ADDQ.L  #2,A7
  1727.     RTS
  1728.  
  1729. .SINGL: DC.W    0
  1730. .ISM:   DC.W    0
  1731. .MV:    MOVE.L  2(A5),D0
  1732. .M: MULU    #6,D0
  1733. .LSL1:  LSL.L   #1,D0
  1734. .LSL2:  LSL.L   #2,D0
  1735. .S1:    MOVE.L  D0,-(A7)
  1736. .S2:    PEA 1.W
  1737. .5: JSR .M
  1738. .4: BSR.W   .M
  1739. .A: ADDQ.L  #4,A7
  1740. .ST:    MOVE.L  D0,2(A5)
  1741. .ST2:   MOVE.L  2(A5),A0
  1742. .ST3:   MOVE.L  D0,4(A0)
  1743. ;.ST4:  MOVE.L  D0,A0
  1744. .GOBJ:  MOVE.L  D0,A0
  1745. .GOBJ2: MOVE.L  4(A4),(A0)
  1746. .GOBJ3: MOVE.L  4(A4),4(A0)
  1747.  
  1748. ; GNEW TRASHES NOTHING
  1749.  
  1750. .GNEW:  MOVEM.L D0/D1/A0,-(A7)
  1751.     MOVEQ   #110+10,D0      ; D0=FASTNEW
  1752.     MOVE.B  #-1,EFUNCBYTE+110   ; fastnew=111
  1753.     MOVE.L  .4(PC),(A4)+        ; GEN CALL
  1754.     TSTMOD
  1755.     BNE.S   .MOD
  1756.     MOVE.W  .5(PC),NEWOP
  1757.     BSR ADDBRANCH
  1758.     BRA.S   .CC
  1759. .MOD:   SUBQ.L  #4,A4
  1760.     MOVE.W  .5(PC),(A4)+
  1761.     BSR ADDBRANCHRELOC
  1762.     MOVE.W  D0,-2(A4)
  1763. .CC:    MOVEM.L (A7)+,D0/D1/A0
  1764.     RTS
  1765.  
  1766. .AD:    MOVE.L  D0,(A7)
  1767. .ALLD:  MOVE.L  (A7)+,D0
  1768. .LOAD:  MOVE.L  (A7),A6
  1769.  
  1770. .NL:    CMP.W   #29,-2(A3)
  1771.     BNE ERROR6
  1772.     MOVE.W  .S2(PC),(A4)+
  1773.     MOVE.L  A4,A6           ; A6=BACKPATCH
  1774.     CLR.W   (A4)+
  1775.     BSR .GNEW
  1776.     MOVE.W  .AD(PC),(A4)+
  1777.     MOVEQ   #0,D6           ; D6=TOTAL MEM USED
  1778.     GTYPE   A0,D7           ; D7=OBJECT OR NIL
  1779.     MOVE.L  D7,D2           ; D2=ADDSIZE IF NIL, ELSE CURMEMBER
  1780.     AND.L   #7,D2
  1781.     CMP.L   D2,D7
  1782.     BNE.S   .TIO
  1783.     MOVEQ   #0,D7
  1784.     MOVE.L  D2,D1           ; D1=STORESIZE
  1785.     TST.L   D2
  1786.     BNE.S   .TTD
  1787.     MOVEQ   #4,D2           ; true list
  1788.     MOVEQ   #4,D6           ; 4 EXTRA, ONLY 2 USED!
  1789.     BRA.S   .TTD
  1790. .TIO:   MOVE.L  D7,A0
  1791.     TST.W   (A0)
  1792.     BNE ERROR60
  1793.     MOVE.L  OMEMB(A0),D2
  1794.     MOVE.L  D2,A0
  1795.     MOVE.W  (A0),D6
  1796.     EXT.L   D6
  1797. .TTD:   CMP.W   #30,(A3)
  1798.     BEQ.S   .NLO
  1799. .NLL:   TST.L   D7
  1800.     BEQ.S   .NOBJ
  1801.     TST.L   D2
  1802.     BEQ ERROR46
  1803.     MOVE.L  D2,A0
  1804.     ;MOVE.L OASCII(A0),D1       ; PRIVATE MEMBER IN OBJECT
  1805.     ;BEQ    ERROR60
  1806.     ;BTST   #0,OFLAGS(A0)
  1807.     ;BNE    ERROR60
  1808.     MOVE.W  OSIZE(A0),D1        ; ARRAY IN OBJECT
  1809.     BEQ ERROR40
  1810. .NOBJ:  MOVEM.L D1/D2/D6/D7/A6,-(A7)
  1811.     BSR EXP
  1812.     MOVEM.L (A7)+,D1/D2/D6/D7/A6
  1813.     MOVE.W  .LOAD(PC),(A4)+
  1814.     MOVE.B  .TAB(PC,D1.W),D0
  1815.     EXT.W   D0
  1816.     MOVE.W  .STORE(PC,D0.W),(A4)+
  1817.     MOVE.W  D6,(A4)+
  1818.     TST.L   D7
  1819.     BNE.S   .TOBJ
  1820.     ADD.L   D2,D6
  1821.     BRA.S   .NLO
  1822. .STORE: MOVE.B  D0,2(A6)
  1823.     MOVE.W  D0,2(A6)
  1824.     MOVE.L  D0,2(A6)
  1825. .TAB:   DC.B    8,0,4,0,8,0
  1826. .TOBJ:  MOVE.L  D2,A0
  1827.     MOVE.L  -(A0),A0
  1828.     MOVE.L  A0,D2           ; stop if last in memberchain
  1829.     BEQ.S   .TEND
  1830.     MOVE.W  (A0),D6
  1831.     EXT.L   D6
  1832.     BRA.S   .NLO
  1833. .TEND:  CMP.W   #30,(A3)+
  1834.     BNE ERROR0
  1835.     BRA.S   .TC
  1836. .NLO:   CMP.W   #COM,(A3)+      ; end of loop
  1837.     BEQ.S   .NLL
  1838.     CMP.W   #30,-2(A3)      ; expect an "]"
  1839.     BNE ERROR0
  1840. .TC:    TST.L   D7
  1841.     BNE.S   .SK1A           ; only if its a list, NO OBJ, SIZE=4
  1842.     CMP.W   #4,D2
  1843.     BNE.S   .SK1
  1844.     CMP.W   #19,(A3)        ; IF ":" THEN IT WASN'T A LIST
  1845.     BEQ.S   .SK1
  1846.     MOVE.L  .SL(PC),(A4)+
  1847.     MOVE.L  D6,D0
  1848.     LSR.L   #2,D0
  1849.     SUBQ.L  #1,D0
  1850.     MOVE.W  D0,(A4)+
  1851.     MOVE.W  D0,(A4)+
  1852.     MOVE.W  .SL2(PC),(A4)+
  1853.     BRA.S   .SK2
  1854. .SK1A:  MOVE.L  D7,A0
  1855.     MOVE.W  OSIZE(A0),D6
  1856.     BEQ ERROR40
  1857.     EXT.L   D6
  1858. .SK1:   MOVE.W  .ALLD(PC),(A4)+
  1859. .SK2:   MOVE.W  D6,(A6)
  1860.     GEAT    D0
  1861.     AND.L   #$FFFF8000,D6
  1862.     BNE ERROR46
  1863.     BRA.W   .XXXX
  1864. .SL:    MOVE.L  (A7)+,A6
  1865.     MOVE.L  #2,(A6)+
  1866. .SL2:   MOVE.L  A6,D0
  1867. ;*-*
  1868. ;; "?"
  1869. EXPQMARK:
  1870.     CMP.W   #1,D5
  1871.     BNE     ERROR0
  1872.     bset    #2,ICODEPREFS+3
  1873.     MOVE.W  #$4A80,(A4)+        ; TST.L D0
  1874.     MOVE.W  #$6700,(A4)+        ; BNE   xxx
  1875.     MOVE.L  A4,-(A7)
  1876.     CLR.W   (A4)+               ; BNE   (*+2) - temp
  1877.  
  1878.     BSR     EXP                 ; <EXP>
  1879.  
  1880.     CMP.W   #19,(A3)            ; "... ? <a> : <b>" ?
  1881.     BNE     .1
  1882.     MOVE.W  #$6000,(A4)+        ; BRA   xxx
  1883.     MOVE.L  A4,A1
  1884.     CLR.W   (A4)+               ; BRA   (*+2) - temp
  1885. .1:
  1886.     MOVE.L  A4,D0
  1887.     MOVE.L  (A7),A0
  1888.     SUB.L   (A7)+,D0
  1889.     MOVE.W  D0,(A0)             ; make _real_ BNE
  1890.  
  1891.     CMP.W   #19,(A3)            ; <a> ? <b> [: <c>]
  1892.     BNE     .X
  1893.     ADDQ.L  #2,A3
  1894.     MOVE.L  A1,-(A7)
  1895.     BSR     EXP
  1896.     MOVE.L  A4,D0
  1897.     MOVE.L  (A7),A0
  1898.     SUB.L   (A7)+,D0
  1899.     MOVE.W  D0,(A0)
  1900. .X: BRA     EXPLOOP
  1901. ;*-*
  1902. ;; "{"
  1903. CURLY:
  1904.     CLR.L   LAST_CMD_ADR
  1905.     CMP.W   #1,D5
  1906.     BEQ ERROR0
  1907.     CMP.W   #IDENT,(A3)+
  1908.     BNE ERROR4
  1909.     MOVE.L  (A3)+,A0
  1910.     BTST    #3,5(A0)
  1911.     BNE ERROR50         ; YOU CAN'T GET THE ADDRESS OF A REG :-)
  1912.     CMP.B   #LAB,4(A0)
  1913.     BNE.W   .3
  1914.     BTST    #4,5(A0)        ; THE LAB VERSION
  1915.     BNE ERROR4          ; (NO ADR OF METHOD)
  1916.  
  1917.     MOVE.W  10(A0),D0
  1918.     BMI.S   .MINM
  1919.     MOVE.L  .1(PC),(A4)+
  1920.     MOVE.W  .1L(PC),NEWOP
  1921.     BSR ADDBRANCH
  1922.     BRA.S   .D
  1923. .MINM:  MOVE.W  .1L(PC),(A4)+       ; ADR OF LABEL OF OTHER MODULE
  1924.     GETM    A6
  1925.     MOVE.L  A1,-(A7)
  1926.     MOVE.L  VARHEAVY(A0),A1     ; A1=PTR TO PROCCLASS
  1927.     MOVE.L  PC_ACC(A1),D0
  1928.     MOVE.L  A6,PC_ACC(A1)
  1929.     MOVE.L  D0,(A6)+
  1930.     MOVE.L  A4,(A6)+
  1931.     MOVE.L  (A7)+,A1
  1932.     DONEM   A6
  1933.     CLR.L   (A4)+
  1934. .D:
  1935.     CMP.W   #-1,D5
  1936.     BNE.S   .8
  1937.     MOVE.W  .4(PC),(A4)+
  1938.     BRA.S   .9
  1939. .8: MOVE.W  .2(PC),(A4)+
  1940.     BSR CLOSEEXP
  1941. .9: CMP.W   #24,(A3)+
  1942.     BNE ERROR29
  1943.     MOVEQ   #1,D5
  1944.     BRA EXPLOOP
  1945. .1: LEA .1(PC),A0
  1946. .1L:    LEA .1,A0
  1947. .2: MOVE.L  A0,D1
  1948. .4: MOVE.L  A0,D0
  1949. .5: LEA 2(A5),A0
  1950. .3: MOVE.W  .5(PC),(A4)+        ; THE VAR VERSION
  1951.     BSR GVA0D2_0
  1952.     CMP.W   #-1,D5
  1953.     BNE.S   .6
  1954.     MOVE.W  .4(PC),(A4)+
  1955.     BRA.S   .7
  1956. .6: MOVE.W  .2(PC),(A4)+
  1957.     BSR CLOSEEXP
  1958. .7: MOVEQ   #1,D5
  1959.     CMP.W   #24,(A3)+
  1960.     BNE ERROR29
  1961.     BRA EXPLOOP
  1962. ;*-*
  1963. ;; "'"
  1964. STRINGLINK:   DC.L    0
  1965.  
  1966. EXPSTRING:
  1967.     CLR.L   LAST_CMD_ADR
  1968.     CMP.W   #1,D5
  1969.     BEQ ERROR0
  1970.     MOVEQ   #0,D0
  1971.     ADDQ.L  #2,A3
  1972.     MOVE.W  (A3)+,D0        ; D0=STRINGLENGTH IN W
  1973.     move.l  a4,-(a7)
  1974.     LEA EXPSTRINGCODE(PC),A0
  1975.     CMP.W   #-1,D5
  1976.     BNE.S   .SK
  1977.     LEA EXPSTRINGCODE2(PC),A0
  1978. .SK:    MOVE.L  (A0)+,(A4)+
  1979.     MOVEM.L A0/D0,-(A7)
  1980.     BSR.W   NEWLABEL        ; ->D0
  1981.     MOVE.W  LONGLEA(PC),NEWOP
  1982.     BSR ADDBRANCH
  1983.     GETM    A6          ; A6=HEAP
  1984.     MOVE.L  STRINGLINK(PC),(A6)
  1985.     MOVE.L  A6,STRINGLINK
  1986.     ADDQ.L  #4,A6
  1987.     MOVE.W  D0,(A6)+
  1988.     MOVEM.L (A7)+,D0/A0
  1989.     MOVE.L  A3,(A6)+
  1990.     MOVE.L  A6,D7           ; D7=LASTPTR
  1991.     CLR.L   (A6)+
  1992.     LSL.W   #1,D0
  1993.     MOVE.W  D0,D2           ; D2=TOTALLEN STRINGS
  1994.     EXT.L   D2
  1995.     ADD.W   D0,A3
  1996.     DONEM   A6
  1997.     move.l  a4,d0
  1998.     sub.l   (A7)+,d0
  1999.     cmp.l   #6,d0
  2000.     beq     .1
  2001.     MOVE.W  (A0)+,(A4)+
  2002.     bra     PLUSTRINGS
  2003. .1: cmp.l   #EXPSTRINGCODE2,a0
  2004.     bmi     PLUSTRINGS
  2005.     or.w    #1,-4(a4)
  2006. PLUSTRINGS:
  2007.     CMP.L   #$70006,(A3)
  2008.     BNE.S   .X
  2009.     ADDQ.L  #6,A3
  2010.     MOVE.W  (A3)+,D0
  2011.     GETM    A6
  2012.     MOVE.L  D7,A0
  2013.     MOVE.L  A6,(A0)
  2014.     MOVE.L  A3,(A6)+
  2015.     MOVE.L  A6,D7
  2016.     CLR.L   (A6)+
  2017.     DONEM   A6
  2018.     LSL.W   #1,D0
  2019.     EXT.L   D0
  2020.     ADD.L   D0,D2
  2021.     ADD.W   D0,A3
  2022.     BRA.S   PLUSTRINGS
  2023. .X: CMP.W   #-1,D5
  2024.     BEQ.S   .1
  2025.     BSR CLOSEEXP
  2026. .1: MOVEQ   #1,D5
  2027.     CMP.L   #800,D2
  2028.     BPL ERROR46
  2029.     BRA EXPLOOP
  2030.  
  2031.  
  2032. EXPSTRINGCODE:
  2033.     LEA EXPSTRINGCODE2(PC),A0   ; 6-2 BYTES
  2034.     MOVE.L  A0,D1
  2035. EXPSTRINGCODE2:
  2036.     LEA EXPSTRINGCODE(PC),A0    ; 6-2 BYTES
  2037.     MOVE.L  A0,D0
  2038. LONGLEA:
  2039.     MOVE.L #EXPSTRINGCODE,D0
  2040.  
  2041. MAKESTRLEN:
  2042.     MOVE.L  #0,-36(A4)
  2043. MAKESTRLEN2:
  2044.     MOVEQ   #0,D0
  2045.     MOVE.L  D0,-36(A4)
  2046.  
  2047. D0EXT:    EXT.L   D0
  2048. ;*-*
  2049. ;; "("
  2050. EXPREC:
  2051.     CMP.W   #1,D5
  2052.     BEQ ERROR0
  2053.     BSR.W   SD0
  2054.     BSR.W   EXP
  2055.     BSR.W   RD0
  2056.     ADDQ.L  #2,A3
  2057.     MOVEQ   #1,D5
  2058.     BRA EXPLOOP
  2059. ;*-*
  2060. ;; "<>"
  2061. EXPCONSNIL:
  2062.     MOVEQ   #1,D5
  2063.     MOVEQ   #0,D1
  2064.     BRA VALUENTRY
  2065. ;*-*
  2066. ;; <x>
  2067. EXPCONS:
  2068.     CLR.L   LAST_CMD_ADR
  2069.     CMP.W   #1,D5
  2070.     BEQ ERROR0
  2071.     BSR.W   SD0
  2072.     CLR.W   -(A7)
  2073. .XL:MOVE.W  #16,EAREQUEST
  2074.     BSR EAEXP
  2075.     TST.L   D0
  2076.     BNE.S   .OPT
  2077.     MOVE.W  .4(PC),(A4)+
  2078. .OPT:   ADDQ.W  #4,(A7)
  2079.     CMP.W   #COM,(A3)+
  2080.     BEQ.S   .XL
  2081.     CMP.W   #46,-(A3)
  2082.     BNE.S   .NC
  2083.     ADDQ.L  #2,A3
  2084.     MOVE.W  #16,EAREQUEST
  2085.     BSR EAEXP
  2086.     TST.L   D0
  2087.     BNE.S   .OPT2
  2088.     MOVE.W  .4(PC),(A4)+
  2089. .OPT2:  BRA.S   .D
  2090. .NC:    MOVE.W  .5(PC),(A4)+
  2091. .D: CMP.W   #12,(A3)+
  2092.     BNE ERROR0
  2093.     MOVE.W  .6(PC),(A4)+
  2094.     MOVE.W  (A7),D0
  2095.     SUBQ.W  #4,D0
  2096.     MOVE.W  D0,(A4)+
  2097.     MOVE.L  #120+10,D0      ; D0=CONS
  2098.     MOVE.B  #-1,EFUNCBYTE+120   ; _Cons=121
  2099.     MOVE.L  .4B(PC),(A4)+       ; GEN CALL
  2100.     TSTMOD
  2101.     BNE.S   .MOD
  2102.     MOVE.W  .5B(PC),NEWOP
  2103.     BSR ADDBRANCH
  2104.     BRA.S   .CC
  2105. .MOD:   SUBQ.L  #4,A4
  2106.     MOVE.W  .5B(PC),(A4)+
  2107.     BSR ADDBRANCHRELOC
  2108.     MOVE.W  D0,-2(A4)
  2109. .CC:    MOVE.W  .7(PC),(A4)+
  2110.     MOVE.W  (A7)+,D0
  2111.     ADDQ.W  #8,D0
  2112.     MOVE.W  D0,(A4)+
  2113.     BSR.W   RD0
  2114.     MOVEQ   #1,D5
  2115.     BRA EXPLOOP
  2116. .4: MOVE.L  D0,-(A7)
  2117. .5: CLR.L   -(A7)
  2118. .6: PEA 0.W
  2119. .5B:    JSR .4
  2120. .4B:    BSR.W   .4
  2121. .7: LEA 4(A7),A7
  2122. ;*-*
  2123. ;; "!"
  2124. EXPFLT:
  2125.     BTST    #1,CODEPREFS
  2126.     BNE     .FP
  2127.     BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
  2128.     CMP.W   #0,D5
  2129.     BEQ ERROR0          ; ALWAYS AFTER (1) OR (-1)
  2130.     LEA .2(PC),A0
  2131.     TST.W   FLTFLAG
  2132.     BEQ.S   .1
  2133.     CLR.W   FLTFLAG         ; CLEAR FLOATMODUS
  2134.     CMP.W   #-1,D5
  2135.     BEQ ERROR0
  2136.     MOVE.L  (A0)+,(A4)+
  2137.     MOVE.W  (A0)+,(A4)+
  2138.     MOVE.W  #-30,(A4)+
  2139.     BRA EXPLOOP
  2140. .1: MOVE.W  #-1,FLTFLAG     ; SET FLOATMODUS
  2141.     CMP.W   #-1,D5
  2142.     BEQ.S   .3
  2143.     MOVE.L  (A0)+,(A4)+
  2144.     MOVE.W  (A0)+,(A4)+
  2145.     MOVE.W  #-36,(A4)+
  2146. .3: BRA EXPLOOP
  2147. .2: MOVE.L  -56(A4),A6
  2148.     JSR -30(A6)
  2149.  
  2150. .FP:
  2151.     CMP.W   #0,D5
  2152.     BEQ ERROR0          ; ALWAYS AFTER (1) OR (-1)
  2153.     TST.W   FLTFLAG
  2154.     BEQ.S   .F1
  2155.     CLR.W   FLTFLAG         ; CLEAR FLOATMODUS
  2156.     CMP.W   #-1,D5
  2157.     BEQ ERROR0
  2158.     MOVE.L  .F2(PC),(A4)+
  2159. ;    MOVE.L  .FF(PC),(A4)+  ; uncomment for rounding
  2160. ;    MOVE.L  .FF+4(PC),(A4)+
  2161. ;    MOVE.L  .FF+8(PC),(A4)+
  2162. ;    CMP.W   #1,ECPU
  2163. ;    BGT     .FXZ
  2164. ;    MOVE.L  .FF+12(PC),(A4)+
  2165. ;    MOVE.W  .FF+18(PC),(A4)+
  2166.     BRA EXPLOOP
  2167. .FXZ:
  2168.     MOVe.L  .FF+16(PC),(A4)+
  2169.     BRA EXPLOOP
  2170. .F1:MOVE.W  #-1,FLTFLAG     ; SET FLOATMODUS
  2171.     CMP.W   #-1,D5
  2172.  
  2173.     BEQ.S   .F3
  2174.     MOVE.L  .F2+4(PC),(a4)+
  2175. .F3:BRA EXPLOOP
  2176. .F2:FMOVE.L FP0,D0
  2177.     FMOVE.L D0,FP0
  2178. .FF:FMOVE.L D0,FP1  ; 4
  2179.     FCMP    FP1,FP0 ; 4
  2180.     FSLT    D2      ; 4
  2181.     EXT.W   D2      ; 2
  2182.     EXT.L   D2      ; 2
  2183.     EXTB.L  D2      ; 2
  2184.     ADD.L   D2,D0   ; 2
  2185. ;*-*
  2186. ;; "`"
  2187. EXPQUOTE:
  2188.     CLR.L   LAST_CMD_ADR
  2189.     CMP.W   #1,D5
  2190.     BEQ ERROR0
  2191.     BSR.W   SD0
  2192.     LEA .1(PC),A0
  2193.     MOVE.L  (A0)+,(A4)+
  2194.     MOVE.L  (A0)+,(A4)+
  2195.     MOVE.W  (A0)+,(A4)+
  2196.     MOVE.L  A4,-(A7)
  2197.     BSR.W   EXP
  2198.     MOVE.W  .2(PC),(A4)+
  2199.     MOVE.L  (A7)+,A0
  2200.     MOVE.L  A4,D0
  2201.     SUB.L   A0,D0
  2202.     ADDQ.L  #2,D0
  2203.     MOVE.W  D0,-2(A0)
  2204.     BSR.W   RD0
  2205.     MOVEQ   #1,D5
  2206.     BRA EXPLOOP
  2207. .1: LEA .2(PC),A0
  2208.     MOVE.L  A0,D0
  2209.     BRA .1
  2210. .2: RTS
  2211. ;*-*
  2212. ;; SIZEOF
  2213. EXPSIZEOF:
  2214.     CLR.L   LAST_CMD_ADR
  2215.     MOVE.W  (A3),D0
  2216.     CMP.W   #IOFF+20,D0
  2217.     BPL.S   .1
  2218.     CMP.W   #IDENT,D0
  2219.     BEQ     .4
  2220.     CMP.W   #31,D0
  2221.     BNE ERROR40
  2222.     MOVE.W  #55,-2(A3)
  2223.     MOVE.W  #VALUE,(A3)+
  2224.     MOVE.L  (A3),A0
  2225.     MOVE.W  4(A0),2(A3)
  2226.     BEQ ERROR40
  2227.     CLR.W   (A3)
  2228.     BRA EXPVALUE
  2229. .1: CMP.W   #IOFF+23,D0
  2230.     BPL ERROR0
  2231.     ADDQ.L  #2,A3
  2232.     SUB.W   #IOFF+20,D0
  2233.     CMP.W   #1,D5
  2234.     BEQ ERROR0
  2235.     BSR.W   SD0
  2236.     MOVE.B  .3(PC),(A4)+
  2237.     MOVE.B  .2(PC,D0.W),(A4)+
  2238.     BSR.W   RD0
  2239.     MOVEQ   #1,D5
  2240.     BRA EXPLOOP
  2241. .4: ADDQ.L  #2,A3
  2242.     MOVE.L  (A3)+,A0
  2243.     MOVE.L  (A0),D0
  2244.     CMP.L   #4,D0
  2245.     BLE     .5
  2246.     MOVE.L  D0,A0
  2247.     MOVE.W  OSIZE(A0),D0
  2248. .5: CMP.W   #126,D0
  2249.     BGT     .6
  2250.     BSR SD0
  2251.     MOVE.B  .3(PC),(A4)+
  2252.     MOVE.B  D0,(A4)+
  2253.     BSR RD0
  2254.     MOVEQ   #1,D5
  2255.     BRA EXPLOOP
  2256. .6: BSR SD0
  2257.     MOVE.W  .7(PC),(A4)+
  2258.     EXT.L   D0
  2259.     MOVE.L  D0,(A4)+
  2260.     BSR RD0
  2261.     MOVEQ   #1,D5
  2262.     BRA EXPLOOP
  2263.  
  2264. .2: DC.B    4,2,1,0
  2265. .3: MOVEQ   #0,D0
  2266. .7: MOVE.L  #0,D0
  2267. ;*-*
  2268. ;; IF
  2269. EXPIF:
  2270.     MOVE.L  D0,D7           ; FOR DOJOB
  2271.     CMP.W   #1,D5
  2272.     BEQ     ERROR0
  2273.     BSR.W   SD0
  2274.     CLR.W   ELSECHECK
  2275.     MOVE.L  A5,-(A7)
  2276.     MOVEM.L D3-D5/A1/A2,-(A7)
  2277.     BSR.W   DOKEYWORD
  2278.     MOVEM.L (A7)+,D3-D5/A1/A2
  2279.     CMP.L   (A7)+,A5
  2280.     BNE     ERROR41
  2281.     TST.W   ELSECHECK
  2282.     BEQ     ERROR41
  2283.     BSR     RD0
  2284.     MOVEQ   #1,D5
  2285.     bset    #2,ICODEPREFS+3
  2286.     BRA     EXPLOOP
  2287.  
  2288. ELSECHECK:    DC.W    0
  2289. ;*-*
  2290. ;; ==
  2291. EXP_CHECK:
  2292.     CMp.W   #1,D5
  2293.     BNE ERROR0
  2294.     addq.l  #2,a3
  2295.     TST.W   FLTFLAG
  2296.     BNE     .FLOATS
  2297.     CMP.W   #29,(A3)+
  2298.     BNE ERROR0
  2299.     MOVe.L  A1,-(A7)
  2300.     ADDQ.L  #4,A3
  2301.     BSR NEWLABEL
  2302.     MOVE.L  D0,-(A7)
  2303. .LOOP:
  2304.     BSR SD0
  2305.     BSR EXP
  2306.     LEA EXPCMP(PC),A1
  2307.     BSR RD0
  2308.     CMp.W   #IOFF+39,(A3)
  2309.     BNe .OTHER
  2310.     TST.W   FLTFLAG
  2311.     MOVE.L  .CODE0(PC),(A4)+
  2312.     BSR NEWLABEL
  2313.     MOVE.L  D0,-(A7)
  2314.     CLR.W   NEWOP
  2315.     BSR ADDBRANCH
  2316.     ADDQ.L #2,A3
  2317.     BSR SD0
  2318.     BSR EXP
  2319.     LEA EXPCMP(PC),A1
  2320.     BSR RD0
  2321.     MOVE.L  .CODE1(PC),(A4)+
  2322.     MOVE.L  4(A7),D0
  2323.     BSR ADDBRANCH
  2324.     MOVE.L  (A7)+,D0
  2325.     BSR ADDLABEL
  2326.     BRA .NEXT
  2327. .OTHER:
  2328.     MOVE.L  .CODE2(PC),(A4)+
  2329.     MOVE.L  (A7),D0
  2330.     BSR ADDBRANCH
  2331. .NEXT:
  2332.     CMP.W   #COM,(A3)+
  2333.     BEQ .LOOP
  2334.  
  2335.     CMP.W   #30,-2(A3)
  2336.     BNE ERROR34
  2337.     MOVE.L  .CODE3(PC),(A4)+
  2338.     CLR.W   (A4)+
  2339.     BSR NEWLABEL
  2340.     MOVe.L  D0,-(A7)
  2341.     BSR ADDBRANCH
  2342.     MOVE.L  4(A7),D0
  2343.     BSR ADDLABEL
  2344.     MOVE.W  .CODE4(PC),(A4)+
  2345.     MOVE.L  (A7)+,D0
  2346.     BSR ADDLABEL
  2347.     ADDQ.L  #4,A7
  2348.     MOVEQ   #1,D5
  2349.     MOVE.L  (A7)+,A1
  2350.     BRA EXPLOOP
  2351.  
  2352. .FLOATS:
  2353.     BTST    #1,CODEPREFS
  2354.     BEQ     .IEEE
  2355.  
  2356.     CMP.W   #29,(A3)+
  2357.     BNE ERROR0
  2358.     MOVe.L  A1,-(A7)
  2359.     ADDQ.L  #4,A3
  2360.     BSR NEWLABEL
  2361.     MOVE.L  D0,-(A7)
  2362. .LOOP2:
  2363.     BSR SD0
  2364.     BSR EXP
  2365.     LEA EXPCMP(PC),A1
  2366.  
  2367.     CMP.W   #IOFF+39,(A3)
  2368.     BNE     .00
  2369.     MOVEQ   #2,D3
  2370.     BRA     .01
  2371. .00:MOVEQ   #0,D3
  2372. .01:BSR RD0
  2373.     CMp.W   #IOFF+39,(A3)
  2374.     BNe .OTHER2
  2375.     TST.W   FLTFLAG
  2376.     MOVE.L  .CODE5(PC),(A4)+
  2377.     BSR NEWLABEL
  2378.     MOVE.L  D0,-(A7)
  2379.     CLR.W   NEWOP
  2380.     BSR ADDBRANCH
  2381.     ADDQ.L #2,A3
  2382.     BSR SD0
  2383.     BSR EXP
  2384.     LEA EXPCMP(PC),A1
  2385.     MOVEQ   #4,D3
  2386.     BSR RD0
  2387.     MOVE.L  .CODE5(PC),(A4)+
  2388.     MOVE.L  4(A7),D0
  2389.     BSR ADDBRANCH
  2390.     MOVE.L  (A7)+,D0
  2391.     BSR ADDLABEL
  2392.     BRA .NEXT2
  2393. .OTHER2:
  2394.     MOVE.L  .CODE5(PC),(A4)+
  2395.     MOVE.L  (A7),D0
  2396.     BSR ADDBRANCH
  2397. .NEXT2:
  2398.     CMP.W   #COM,(A3)+
  2399.     BEQ .LOOP2
  2400.  
  2401.     CMP.W   #30,-2(A3)
  2402.     BNE ERROR34
  2403.     MOVE.L  .CODE3(PC),(A4)+
  2404.     CLR.W   (A4)+
  2405.     BSR NEWLABEL
  2406.     MOVe.L  D0,-(A7)
  2407.     BSR ADDBRANCH
  2408.     MOVE.L  4(A7),D0
  2409.     BSR ADDLABEL
  2410.     MOVE.W  .CODE4(PC),(A4)+
  2411.     MOVE.L  (A7)+,D0
  2412.     BSR ADDLABEL
  2413.     ADDQ.L  #4,A7
  2414.     MOVEQ   #1,D5
  2415.     MOVE.L  (A7)+,A1
  2416.     MOVE.L  .CODE6(PC),(A4)+
  2417.     BRA EXPLOOP
  2418.  
  2419. .IEEE:
  2420.     CMP.W   #29,(A3)+
  2421.     BNE ERROR0
  2422.     MOVe.L  A1,-(A7)
  2423.     ADDQ.L  #4,A3
  2424.     BSR NEWLABEL
  2425.     MOVE.L  D0,-(A7)
  2426.     MOVE.W  .CODE7(PC),(A4)+
  2427. .LOOP3:
  2428.     BSR EXP
  2429.     MOVE.L  .CODE8(PC),(A4)+
  2430.     CMP.W   #IOFF+39,(A3)
  2431.     BNE     .20
  2432.     MOVE.W  .CODEB(PC),D3
  2433.     BRA     .21
  2434. .20:MOVE.W  .CODEA(PC),D3
  2435. .21:LEA EXPCMP(PC),A1
  2436.     BSR CLOSEEXP
  2437.     CMp.W   #IOFF+39,(A3)
  2438.     BNe .OTHER3
  2439.     TST.W   FLTFLAG
  2440.     MOVE.L  .CODE5(PC),(A4)+
  2441.     BSR NEWLABEL
  2442.     MOVE.L  D0,-(A7)
  2443.     CLR.W   NEWOP
  2444.     BSR ADDBRANCH
  2445.     ADDQ.L #2,A3
  2446.     BSR EXP
  2447.     MOVE.L  .CODE8(PC),(A4)+
  2448.     LEA EXPCMP(PC),A1
  2449.     MOVE.W  .CODEC(PC),D3
  2450.     BSR CLOSEEXP
  2451.     MOVE.L  .CODE5(PC),(A4)+
  2452.     MOVE.L  4(A7),D0
  2453.     BSR ADDBRANCH
  2454.     MOVE.L  (A7)+,D0
  2455.     BSR ADDLABEL
  2456.     BRA .NEXT3
  2457. .OTHER3:
  2458.     MOVE.L  .CODE5(PC),(A4)+
  2459.     MOVE.L  (A7),D0
  2460.     BSR ADDBRANCH
  2461. .NEXT3:
  2462.     CMP.W   #COM,(A3)+
  2463.     BEQ .LOOP3
  2464.  
  2465.     CMP.W   #30,-2(A3)
  2466.     BNE ERROR34
  2467.     MOVE.L  .CODE3(PC),(A4)+
  2468.     CLR.W   (A4)+
  2469.     BSR NEWLABEL
  2470.     MOVe.L  D0,-(A7)
  2471.     BSR ADDBRANCH
  2472.     MOVE.L  4(A7),D0
  2473.     BSR ADDLABEL
  2474.     MOVE.W  .CODE4(PC),(A4)+
  2475.     MOVE.L  (A7)+,D0
  2476.     BSR ADDLABEL
  2477.     ADDQ.L  #4,A7
  2478.     MOVEQ   #1,D5
  2479.     MOVE.L  (A7)+,A1
  2480.     MOVE.W  .CODE9(PC),(A4)+
  2481.     BRA EXPLOOP
  2482.  
  2483.  
  2484.  
  2485. .CODE0:
  2486.     BMI     .CODE0  ;4
  2487. .CODE1:
  2488.     BLE     .CODE1  ;4
  2489. .CODE2:
  2490.     BEQ     .CODE2  ;4
  2491. .CODE3:
  2492.     MOVEQ   #0,D0   ;2
  2493.     BRA     .CODE3  ;4
  2494. .CODE4:
  2495.     MOVEQ   #-1,D0  ;2
  2496. .CODE5:
  2497.     BNE     .CODE5
  2498. .CODE6:
  2499.     FMOVE.L D0,FP0
  2500. .CODE7:
  2501.     MOVE.L  D0,-(A7)
  2502. .CODE8:
  2503.     MOVE.L  D0,D1
  2504.     MOVe.L  (A7),D0
  2505. .CODE9:
  2506.     ADDQ.L  #4,A7
  2507. .CODEA:
  2508.     SEQ D0
  2509. .CODEB:
  2510.     SLT D0
  2511. .CODEC:
  2512.     SLE D0
  2513. ;*-*
  2514.  
  2515. ;; Inter-expression codes
  2516.  
  2517. EXPRCODE1:
  2518.     MOVE.L  D0,-(A7)
  2519. FEXPRCODE1:
  2520.     FMOVE.S FP0,-(A7)   ; 4
  2521.     FMOVE   FP0,FP0     ; 4
  2522. EXPRCODE2:
  2523.     MOVE.L  D0,D1
  2524.     MOVE.L  (A7)+,D0
  2525. FEXPRCODE2:
  2526.     FMOVE.S (A7)+,FP0   ; 4
  2527.     FSMOVE.S (A7)+,FP0  ; 4
  2528. FEXPRCODE_USED_REGS:
  2529.     DC.W    0           ; shouldn't fail ;)
  2530. EXTL:
  2531.     EXT.W   D0
  2532.     EXT.L   D0
  2533. EXTBL:
  2534.     EXTB.L  D0
  2535. MOVEQ:
  2536.     MOVEQ   #0,D0
  2537. FEXPSTART:
  2538.     FMOVE.L #0,FP0
  2539. FEXPS:
  2540.     FMOVEM.X FP2-FP7,-(A7)
  2541. FEXPR:
  2542.     FMOVEM.X (A7)+,FP2-FP7
  2543. ;*-*
  2544. ;; Extend D0
  2545. EXP_EXTD0:
  2546.     CMP.W   #1,ECPU     ;020+ mode?
  2547.     BPL     .020
  2548.     MOVE.L  EXTL(PC),(A4)+
  2549.     RTS
  2550. .020:
  2551.     MOVE.W  EXTBL(PC),(A4)+
  2552.     RTS
  2553. ;*-*
  2554.  
  2555. ;; ExpSwap
  2556. EXPSWAP:
  2557.     MOVE.L  LASTVAR,-(A7)
  2558.     TST.L   LASTVAR
  2559.     BEQ     ERROR0
  2560.     BSR SD0
  2561.     BSR EXP
  2562.     MOVEQ   #1,D4
  2563.     BSR RD0
  2564.     TST.L   LASTVAR
  2565.     BEQ     ERROR0
  2566.     MOVe.L  LASTVAR,A0
  2567.     MOVE.W  .1(PC),(A4)+
  2568.     BSR GVA0D0_0
  2569.     MOVe.L  (A7)+,a0
  2570.     MOVE.W  .2(PC),(A4)+
  2571.     BSR GVA0D0_0
  2572.     BRA EXPLOOP
  2573.  
  2574. .1: MOVE.L  D0,2(A5)
  2575. .2: MOVE.L  D1,2(A5)
  2576. ;*-*
  2577.  
  2578. ;; CloseExp
  2579. CLOSEEXP:
  2580.     TST.W   FLTFLAG
  2581.     BNE     CLOSEFLT
  2582. CLFLTB:
  2583.     CMP.B   #1,D4
  2584.     BEQ     .2
  2585.     CMP.W   #2,D4
  2586.     BEQ.S   .1
  2587.     CMP.W   #3,D4
  2588.     BEQ     .S
  2589.     CMP.W   #4,D4
  2590.     BNE     .3
  2591.     CMP.W   #1,ECPU
  2592.     BPL     .020
  2593. .3:
  2594.     tst.l   LAST_CMD_ADR
  2595.     bne     .TRY_TO_OPTI
  2596. .damn:
  2597.     cmp.l   #$2200201f,-4(a4)
  2598.     bne     .D2
  2599.     cmp.l   #EXPPLUS,A1
  2600.     beq     .OADD
  2601.     cmp.l   #EXPMUL,A1
  2602.     beq     .OMUL
  2603. .D2:
  2604.     MOVE.W  4(A1,D4.W),(A4)+    ; OP
  2605.     CMP.L   #EXPDIV,A1
  2606.     BNE.S   .2
  2607.     MOVE.W  D0EXT(PC),(A4)+
  2608. .2: RTS
  2609. .1: cmp.l   #$2200201f,-4(a4)
  2610.     beq     .1O
  2611.     MOVE.W  10(A1),(A4)+        ; CMP
  2612.     MOVE.W  D3,(A4)+
  2613.     BSR EXP_EXTD0
  2614.     RTS
  2615. .1O:subq.l  #4,a4
  2616.     move.l  #$221fb280,(a4)+
  2617.     move.w  d3,(a4)+
  2618.     bsr EXP_EXTD0
  2619.     rts
  2620. .S: MOVE.W  (A1),(A4)+
  2621.     RTS
  2622. .OADD:
  2623.     subq.l  #4,a4
  2624.     move.w  #$d09f,(a4)+
  2625.     rts
  2626. .OMUL:
  2627.     subq.l  #4,a4
  2628.     cmp.w   #1,ECPU
  2629.     bpl     .OMUL2
  2630.     move.l  #$548fc1df,(a4)+
  2631.     rts
  2632. .OMUL2:
  2633.     move.l  #$4c1f0800,(a4)+
  2634.     rts
  2635. .020:
  2636.     tst.l   LAST_CMD_ADR
  2637.     bne     .TRY_TO_OPTI
  2638.     CMP.L   #EXPDIV,A1
  2639.     BNE     .020M
  2640.     MOVE.L  #$4c410800,(a4)+
  2641.     rts
  2642. .020M:
  2643.     MOVE.L  #$4c010800,(a4)+
  2644.     rts
  2645.  
  2646. .TRY_TO_OPTI:
  2647.     move.l  LAST_CMD_ADR,a0
  2648.     clr.l   LAST_CMD_ADR
  2649.     move.w  (a0),d0
  2650.     and.w   #$FFFE,D0
  2651.     cmp.w   #$222c,d0
  2652.     beq     .OPTI_01
  2653.     and.w   #$FFF8,d0
  2654.     cmp.w   #$2200,d0
  2655.     beq     .OPTI_02
  2656.     move.l  a0,LAST_CMD_ADR
  2657.     bra     .damn
  2658. ;; optimize #1
  2659. .OPTI_01:
  2660.     move.l  a4,d0
  2661.     sub.l   a0,d0
  2662.     cmp.l   #4,d0
  2663.     bgt     .damn
  2664.     move.l  a1,d0
  2665.     sub.l   #EXPAND,d0
  2666.     divs.w  #3,d0
  2667.     move.w  .Cx01(PC,d0),d0
  2668.     swap    d0
  2669.     move.w  (a0),d0
  2670.     and.w   #$7,d0
  2671.     move.w  d0,-(a7)
  2672.     swap    d0
  2673.     or.w    (a7)+,d0
  2674.     move.w  d0,(a0)
  2675.     cmp.l   #EXPMUL,a1
  2676.     bpl     .KEEP_01
  2677. .X_01:
  2678.     rts
  2679. .KEEP_01:
  2680.     cmp.w   #1,ECPU
  2681.     bpl     .KEEP_11
  2682.     add.w   #2,2(a0)
  2683.     cmp.l   #EXPMUL,a1
  2684.     beq     .X_01
  2685.     move.w  D0EXT(PC),(A4)+
  2686.     bra     .X_01
  2687. .KEEP_11:
  2688.     cmp.l   #EXPMUL,a1
  2689.     sgt     d0
  2690.     and.l   #6,d0
  2691.     move.l  .Cx11(PC,D0),D0
  2692.     move.l  d0,-(a7)
  2693.     move.w  (a0),d0
  2694.     and.l   #$7,d0
  2695.     swap    d0
  2696.     or.l    (a7)+,d0
  2697.     move.w  2(a0),-(a7)
  2698.     move.l  d0,(a0)
  2699.     move.w  (a7)+,(a4)+
  2700.     rts
  2701. .Cx01:
  2702.     and.l   1(a0),d0
  2703.     or.l    1(a0),d0
  2704.     cmp.l   1(a0),d0
  2705.     add.l   1(a0),d0
  2706.     sub.l   1(a0),d0
  2707.     muls.w  1(a0),d0
  2708.     divs.w  1(a0),d0
  2709.     move.l  1(a0),d0
  2710. .Cx11:
  2711.     muls.l  1(a0),d0
  2712.     divs.l  1(a0),d0
  2713. ;*-*
  2714. ;; optimize #2
  2715. .OPTI_02:
  2716.     move.l  a4,d0
  2717.     sub.l   a0,d0
  2718.     cmp.l   #2,d0
  2719.     bgt     .damn
  2720.     move.l  a1,d0
  2721.     sub.l   #EXPAND,d0
  2722.     divu.w  #6,d0
  2723.     move.w  .Cx02(pc,d0),d0
  2724.     swap    d0
  2725.     move.w  (a0),d0
  2726.     and.w   #7,d0
  2727.     move.w  d0,-(a7)
  2728.     swap    d0
  2729.     or.w    (a7)+,d0
  2730.     move.w  d0,(a0)
  2731.     cmp.l   #EXPMUL,A1
  2732.     bpl     .KEEP_02
  2733.     rts
  2734. .KEEP_02:
  2735.     cmp.w   #1,ECPU
  2736.     bpl     .KEEP_12
  2737.     cmp.l   #EXPMUL,A1
  2738.     beq     .X_01
  2739.     move.w  D0EXT(PC),(A4)+
  2740.     rts
  2741. .KEEP_12:
  2742.     swap    d0
  2743.     move.w  d0,-(a7)
  2744.     cmp.l   #EXPMUL,A1
  2745.     sgt     d0
  2746.     and.l   #4,d0
  2747.     move.l  .Cx12(PC,d0),d0
  2748.     swap    d0
  2749.     or.w    (a7)+,d0
  2750.     swap    d0
  2751.     move.l  d0,(a0)
  2752.     addq.l  #2,a4
  2753.     rts
  2754.  
  2755.  
  2756. .Cx02:
  2757.     and.l   d0,d0
  2758.     or.l    d0,d0
  2759.     cmp.l   d0,d0
  2760.     add.l   d0,d0
  2761.     sub.l   d0,d0
  2762.     muls.w  d0,d0
  2763.     divs.w  d0,d0
  2764.     move.l  d0,d0
  2765. .Cx12:
  2766.     muls.l  d0,d0
  2767.     divs.l  d0,d0
  2768. ;*-*
  2769. ;*-*
  2770. ;; CloseFlt
  2771. CLOSEFLT:
  2772.     CMP.W   #-1,D5          ; NO MOVE
  2773.     BEQ     CLFLTB
  2774.     CMP.L   #EXPCMP,A1      ; NO AND/OR
  2775.     BMI     CLFLTB
  2776.  
  2777.     btst    #1,CODEPREFS
  2778.     bne     .DONEFP
  2779.     MOVE.L  D0,-(A7)
  2780.     BSR MAKEFLTOPER
  2781.     TST.W   D0
  2782.     BNE.S   .2          ; SEE IF SPCMP
  2783.     btst    #1,CODEPREFS
  2784.     bne .4
  2785.     MOVE.W  D3,(A4)+
  2786.     BSR     EXP_EXTD0
  2787. .2: MOVE.L  (A7)+,D0
  2788.     RTS
  2789. .3: move.w  #1,FINISHFPEXP
  2790.     bsr MAKEFLTOPER
  2791.     TST.W   D0
  2792.     BNE.S   .2          ; SEE IF SPCMP
  2793. .4:
  2794.     bsr EXPFPCMP
  2795.     bra .2
  2796.  
  2797. .DONEFP:
  2798.     moveq   #0,d1
  2799.     cmp.l   #EXPPLUS,a1
  2800.     beq     .FADD
  2801.     cmp.l   #EXPMINUS,a1
  2802.     beq     .FSUB
  2803.     cmp.l   #EXPMUL,a1
  2804.     beq     .FMUL
  2805.     cmp.l   #EXPDIV,a1
  2806.     beq     .FDIV
  2807.     cmp.l   #EXPCMP,a1
  2808.     beq     .FCMP
  2809.     bra     ERROR0
  2810. .FADD:
  2811.     cmp.w   #2,ECPU
  2812.     spl     d0
  2813.     and.l   #4,d0
  2814.     lea     .FC,a0
  2815.     add.l   d0,a0
  2816.     bra     .FFIX
  2817. .FSUB:
  2818.     cmp.w   #2,ECPU
  2819.     spl     d0
  2820.     and.l   #4,d0
  2821.     lea     .FC+8,a0
  2822.     add.l   d0,a0
  2823.     bra     .FFIX
  2824. .FMUL:
  2825.     cmp.w   #2,ECPU
  2826.     spl     d0
  2827.     and.l   #4,d0
  2828.     lea     .FC+16,a0
  2829.     add.l   d0,a0
  2830.     bra     .FFIX
  2831. .FDIV:
  2832.     cmp.w   #2,ECPU
  2833.     spl     d0
  2834.     and.l   #4,d0
  2835.     lea     .FC+24,a0
  2836.     add.l   d0,a0
  2837.     bra     .FFIX
  2838. .FCMP:
  2839.     lea     .FC+32,a0
  2840.     moveq   #-1,d1
  2841. .FFIX:
  2842.     move.l  a4,d0
  2843.     sub.l   LAST_CMD_ADR,d0
  2844.     cmp.l   #8,d0
  2845.     beq     .OPTI
  2846. .OPTIBACK
  2847.     move.l  (a0),(a4)+
  2848.     tst.l   d1
  2849.     beq     .FXIT
  2850.     bsr     EXPFPCMP
  2851. .FXIT:
  2852.     rts
  2853. .OPTI:
  2854.     move.l  .FO,d0
  2855.     cmp.l   -8(a4),d0
  2856.     bne     .OPTIBACK
  2857.     cmp.w   #2,ECPU
  2858.     spl     d0
  2859.     and.l   #4,d0
  2860.     cmp.l   #EXPMUL,a1
  2861.     beq     .OPTIMUL
  2862.     cmp.l   #EXPPLUS,a1
  2863.     bne     .OPTIBACK
  2864.  
  2865.     subq.l  #8,a4
  2866.     lea     .FR,a0
  2867.     add.l   d0,a0
  2868.     move.l  (a0),(a4)+
  2869.     rts
  2870. .OPTIMUL:
  2871.     subq.l  #8,a4
  2872.     lea     .FR+8,a0
  2873.     add.l   d0,a0
  2874.     move.l  (a0),(a4)+
  2875.     rts
  2876.  
  2877. .FO:FMOVE.S FP0,D0
  2878. .FR:FADD.S  (A7)+,FP0
  2879.     FSADD.S (A7)+,FP0
  2880.     FMUL.S  (A7)+,FP0
  2881.     FSGLMUL.S (A7)+,FP0
  2882.  
  2883. .FC:FADD.S  D0,FP0
  2884.     FSADD.S D0,FP0
  2885.     FSUB.S  D0,FP0
  2886.     FSSUB.S D0,FP0
  2887.     FMUL.S  D0,FP0
  2888.     FSGLMUL.S D0,FP0
  2889.     FDIV.S  D0,FP0
  2890.     FSGLDIV.S D0,FP0
  2891.     FCMP.S  D0,FP0
  2892.  
  2893. ;*-*
  2894. ;; Restore
  2895. RD0:
  2896.     CMP.W   #-1,D5
  2897.     BEQ.S   .1
  2898.     BTST    #1,CODEPREFS
  2899.     BEQ     .0
  2900.     TST.W   FLTFLAG
  2901.     BNE     .2
  2902. .0: MOVE.L  EXPRCODE2(PC),(A4)+
  2903.     BSR CLOSEEXP
  2904. .1: RTS
  2905. .2: cmp.w   #2,ECPU
  2906.     bpl     .2O
  2907.     MOVE.L  FEXPRCODE2(PC),(A4)+
  2908.     bra     .2X
  2909. .2O:MOVe.L  FEXPRCODE2+4(PC),(A4)+
  2910. .2X:BSR CLOSEEXP
  2911.     RTS
  2912. ;*-*
  2913. ;; Store
  2914. SD0:
  2915.     CMP.W   #-1,D5
  2916.     BEQ.S   .1
  2917.     tst.l   LAST_CMD_ADR
  2918.     bne     .OPTI
  2919. .OB:BCLR    #2,ICODEPREFS+3
  2920.     BTST    #1,CODEPREFS
  2921.     BEQ .0
  2922.     TST.W   FLTFLAG
  2923.     BNE .2
  2924. .0: MOVE.W  EXPRCODE1(PC),(A4)+
  2925. .1: RTS
  2926. .2: move.l  FEXPRCODE1(PC),(A4)+
  2927.     rts
  2928. .OPTI:
  2929.     btst    #2,ICODEPREFS+3
  2930.     bne     .OB
  2931.     move.l  a4,d0
  2932.     sub.l   LAST_CMD_ADR,d0
  2933.     cmp.w   #2,d0
  2934.     beq     .O2
  2935.     cmp.w   #4,d0
  2936.     beq     .O4
  2937.     cmp.w   #6,d0
  2938.     beq     .O6
  2939.     bra     .OB
  2940. .O4:move.l  LAST_CMD_ADR,a0
  2941.     move.w  (a0),d0
  2942.     and.l   #$FFFE,d0
  2943.     cmp.w   #$202c,d0
  2944.     bne     .OB
  2945.     move.w  (a0),d0
  2946.     and.l   #1,d0
  2947.     or.w    #$2f2c,d0
  2948.     move.w  d0,(a0)
  2949.     rts
  2950. .O6:move.l  LAST_CMD_ADR,a0
  2951.     cmp.w   #$203c,(a0)
  2952.     bne     .OB
  2953.     move.l  2(a0),d0
  2954.     cmp.l   #32767,d0
  2955.     bgt     .O60
  2956.     cmp.l   #-32768,d0
  2957.     bpl     .O61
  2958. .O60:
  2959.     move.w  #$4879,(a0)
  2960.     rts
  2961. .O61:
  2962.     move.w  #$4878,(a0)
  2963.     move.w  d0,2(a0)
  2964.     subq.l  #2,a4
  2965.     rts
  2966. .O2:move.l  LAST_CMD_ADR,a0
  2967.     move.w  (a0),d0
  2968.     and.l   #$FF00,d0
  2969.     cmp.w   #$7000,d0
  2970.     bne     .OB
  2971.     move.w  (a0),d0
  2972.     and.l   #$FF,d0
  2973.     move.w  #$4878,(a0)
  2974.     ext.w   d0
  2975.     move.w  d0,(a4)+
  2976.     rts
  2977. ;*-*
  2978. poprawka=1
  2979.   IFeq poprawka
  2980. ;; new imm list
  2981. EXPIMMLIST:
  2982.     CLR.L   LAST_CMD_ADR
  2983.     cmp.w   #-1,d5
  2984.     bne     ERROR0
  2985.     addq.l  #4,a3       ; skip ] off
  2986.     move.l  a5,-(a7)
  2987.     moveq   #0,d5
  2988. .L1:CHESTB  A5,D1,20,ERROR46
  2989.     addq.l  #1,d5
  2990.     move.l  a3,a0
  2991.     cmp.w   #LIBC,(A3)
  2992.     beq     .L2
  2993.     cmp.w   #STR,(a3)
  2994.     beq     .L4
  2995.     movem.l d5/a0,-(a7)
  2996.     jsr     ASM_GRABVALUE
  2997.     movem.l (A7)+,d5/a0
  2998.     tst.l   d0
  2999.     bmi     .L2
  3000.     move.w  #1,(a5)+    ; value
  3001.     move.l  d1,(a5)+
  3002.     bra     .L3
  3003. .L4:move.w  #3,(a5)+
  3004.     addq.l  #4,a3
  3005.     moveq   #0,d0
  3006.     move.w  (a3)+,d0
  3007.     lsl.w   #1,d0
  3008.     move.l  d0,-(a7)
  3009.     addq.l  #2,d0
  3010.     jsr     NEW
  3011.     tst.l   d0
  3012.     beq     ERROR38
  3013.     move.l  d0,a0
  3014.     move.l  a0,(a5)+
  3015.     move.l  (a7)+,d0
  3016.     move.w  d0,(a0)+
  3017. .L4c:
  3018.     tst.w   d0
  3019.     beq     .L3
  3020.     move.b  (a3)+,(a0)+
  3021.     subq.l  #1,d0
  3022.     bra     .L4c
  3023. .L2:move.l  a0,a3
  3024.     move.w  #16,EAREQUEST
  3025.     move.l  d5,-(a7)
  3026.     bsr     EAEXP
  3027.     tst.l   d0
  3028.     bne     .OPTI
  3029.     move.w  .K4,(a4)+
  3030. .OPTI:
  3031.     move.l  (a7)+,d5
  3032.     move.w  #2,(a5)+    ; expression
  3033. .L3:cmp.w   #COM,(a3)+
  3034.     beq     .L1
  3035.     move.w  #-1,(a5)+   ; done ;)
  3036.     cmp.w   #30,-2(a3)  ; d5 now: numentries
  3037.     bne     ERROR34     ; set backwards!
  3038.     moveq   #4,D2       ; entry size
  3039.     sub.l   a2,a2       ; object
  3040.     cmp.w   #19,(a3)    ; typed?
  3041.     bne     .CNT
  3042.     addq.l  #2,a3
  3043.     move.w  (a3)+,d0
  3044.     cmp.w   #31,d0
  3045.     bne     .C1
  3046.  
  3047.     move.l  (a3),a2    ; count members and calculate size
  3048.     lea     OMEMB+4(a2),a2
  3049.     moveq   #0,d0
  3050. .C2:addq.l  #1,d0
  3051.     tst.l   ONEXT(a2)
  3052.     beq     .C3
  3053.     move.l  ONEXT(a2),a2
  3054.     bra     .C2
  3055. .C3:move.l  (a3)+,a2
  3056.     move.l  d5,d1
  3057.     lsl.w   #2,d1
  3058.     bra     .CNT
  3059. .C1:cmp.w   #IOFF+20,d0
  3060.     bmi     ERROR40
  3061.     cmp.w   #IOFF+22,d0
  3062.     bgt     ERROR40
  3063.     cmp.w   #IOFF+21,d0
  3064.     bmi     .CNT
  3065.     bgt     .CHR
  3066.     moveq   #2,d2
  3067.     bra     .CNT
  3068. .CHR:
  3069.     moveq   #1,d2
  3070. .CNT:
  3071.     cmpa.l  #0,a2
  3072.     bne     .CNT2
  3073.     move.l  d5,d1
  3074.     mulu    d2,d1
  3075. .CNT2:
  3076.     move.l  d1,-(a7)
  3077.     GETM    A0          ; 0=next
  3078.     MOVE.L  IMMLH,(A0)  ; 4=id
  3079.     MOVE.L  A0,IMMLH    ; 6=list
  3080.     addq.l  #4,a0       ; 10=size
  3081.     move.l  a0,-(a7)
  3082.     jsr     NEWLABEL
  3083.     move.l  (a7)+,a0
  3084.     move.w  d0,(a0)+
  3085.     move.l  (a7)+,d1
  3086.     addq.l  #2,d1
  3087.     move.l  d1,d0
  3088.     JSR     NEW
  3089.     move.l  d0,(a0)+
  3090.     move.l  d1,(a0)+    ; :)
  3091.     clr.l   (a0)+
  3092.     DONEM   A0
  3093.  
  3094.     move.l  IMMLH,A0
  3095.     MOVE.W  4(a0),d0
  3096.     move.w  .K1,NEWOP
  3097.     MOVE.l  .K1S,(A4)+
  3098.     move.l  a0,-(a7)
  3099.     jsr     ADDBRANCH
  3100.     move.l  (a7)+,a0
  3101.     move.l  6(a0),a0
  3102.     move.w  d5,(a0)
  3103.  
  3104.     move.l  (a7),a1
  3105.     move.w  #-1,-(a7)
  3106.     moveq   #0,d5
  3107.     cmp.l   #0,a2
  3108.     beq     .F1
  3109.     move.l  OMEMB(a2),a6
  3110. .FL:add.w   OOFF(a6),d5
  3111.     move.w  OSIZE(a6),d2
  3112.     beq     ERROR40
  3113.     cmp.w   #4,d2
  3114.     bgt     ERROR40
  3115. .F1:moveq   #0,d0           ;
  3116.     move.w  (a1)+,d0
  3117.     cmp.w   #1,d0
  3118.     bne     .F2
  3119.     move.l  (a1)+,d0
  3120.     cmp.w   #2,d2
  3121.     blt     .Fb
  3122.     beq     .Fi
  3123.     move.l  d0,2(a0,d5)
  3124.     bra     .F
  3125. .Fb:move.b  d0,2(a0,d5)
  3126.     bra     .F
  3127. .Fi:move.w  d0,2(a0,d5)
  3128.     bra     .F
  3129. .F2:cmp.w   #2,d0
  3130.     bne     .F3
  3131.  
  3132.     move.w  d5,-(a7)
  3133.     move.w  d2,-(a7)
  3134.     move.l  #-1,.T0
  3135.     bra     .F
  3136.  
  3137. .F3:cmp.w   #3,d0
  3138.     bne     .F4
  3139.     move.l  a0,-(a7)
  3140.     GETM    A0
  3141.     move.l  (a1)+,4(a0)
  3142.     MOVE.L  a0,-(a7)
  3143.     bsr     NEWLABEL
  3144.     move.l  (a7)+,a0
  3145.     move.w  d0,8(a0)
  3146.     move.l  a1,-(a7)
  3147.     move.l  IMMLH,a1
  3148.     move.l  14(a1),(a0)
  3149.     move.l  a0,14(a1)
  3150.     move.l  (a7)+,a1
  3151.     move.w  d5,10(a0)
  3152.     add.l   #12,a0
  3153.     DONEM   A0
  3154.     move.l  (a7)+,a0
  3155.     bra     .F
  3156.  
  3157. .F: cmp.l   #0,a2
  3158.     beq     .F1L
  3159.     sub.w   OOFF(a6),d5
  3160.     move.l  ONEXT(a6),d0
  3161.     bne     .FN
  3162.     move.l  OMEMB(a2),d0
  3163. .FN:move.l  d0,a6
  3164.     bra     .FL
  3165. .F1L:
  3166.     add.l   d2,d5
  3167.     bra     .F1
  3168. .F4:cmp.w   #-1,d0
  3169.     bne     ERROR0
  3170.  
  3171. .VL:
  3172.     move.w  (a7)+,d0
  3173.     cmp.w   #-1,d0
  3174.     beq     .VX
  3175.     cmp.w   #2,d0
  3176.     bmi     .VC
  3177.     beq     .VI
  3178.     move.w  .K0,(a4)+
  3179.     move.w  (a7)+,(a4)+
  3180.     bra     .VL
  3181. .VI:move.l  .K2,(a4)+
  3182.     add.w   #$2000,-2(a4)
  3183.     move.w  (a7)+,(a4)+
  3184.     bra     .VL
  3185. .VC:move.l  .K2,(A4)+
  3186.     move.w  (A7)+,(A4)+
  3187.     bra     .VL
  3188. .VX:
  3189.     move.l  (a7)+,a5
  3190.     moveq   #1,d5
  3191.     tst.l   .T0
  3192.     bne     .X2
  3193.     cmp.w   #$41FA,-4(a4)
  3194.     beq     .X2
  3195.     move.w  #$203c,-6(a4)
  3196.     bra     EXPLOOP
  3197. .X2:mOVE.L  A4,LAST_CMD_ADR
  3198.     move.w  .K3,(a4)+
  3199.     bra     EXPLOOP
  3200.  
  3201. .K0:MOVE.L  (A7)+,4(A0)
  3202. .K1:LEA     $0,A0
  3203. .K1S:
  3204.     LEA     .K1S(PC),A0
  3205. .K2:MOVE.L  (A7)+,D0
  3206.     MOVE.B  D0,4(A0)
  3207. .K3:MOVE.L  A0,D0
  3208. .K4:MOVE.L  D0,-(A7)
  3209. .T0:
  3210.     DC.L    0
  3211. IMMLH:
  3212.     DC.L    0
  3213. ; list entry struct:
  3214. ; (  0) next
  3215. ; (  4) listid [used with addreloc etc]
  3216. ; (  6) list array
  3217. ; ( 10) list size
  3218. ; ( 14) list references
  3219. STRLH:
  3220.     DC.L    0
  3221. ; string entry struct:
  3222. ; (  0) next
  3223. ; (  4) interim ptr
  3224. ; (  8) strid [used with addreloc etc]
  3225. ;*-*
  3226.   endc
  3227.   ifne poprawka
  3228. ;; new imm list
  3229. EXPIMMLIST:
  3230.     CLR.L   LAST_CMD_ADR
  3231.     cmp.w   #-1,d5
  3232.     bne     ERROR0
  3233.     addq.l  #4,a3       ; skip ] off
  3234.     move.l  a5,-(a7)
  3235.     moveq   #0,d5
  3236. .L1:CHESTB  A5,D1,20,ERROR46
  3237.     addq.l  #1,d5
  3238.     move.l  a3,a0
  3239.     cmp.w   #LIBC,(A3)
  3240.     beq     .L2
  3241.     cmp.w   #STR,(a3)
  3242.     beq     .L4
  3243.     movem.l d5/a0,-(a7)
  3244.     jsr     ASM_GRABVALUE
  3245.     movem.l (A7)+,d5/a0
  3246.     tst.l   d0
  3247.     bmi     .L2
  3248.     move.w  #1,(a5)+    ; value
  3249.     move.l  d1,(a5)+
  3250.     bra     .L3
  3251. .L4:move.w  #3,(a5)+
  3252.     addq.l  #4,a3
  3253.     moveq   #0,d0
  3254.     move.w  (a3)+,d0
  3255.     lsl.w   #1,d0
  3256.     move.l  d0,-(a7)
  3257.     addq.l  #2,d0
  3258.     jsr     NEW
  3259.     tst.l   d0
  3260.     beq     ERROR38
  3261.     move.l  d0,a0
  3262.     move.l  a0,(a5)+
  3263.     move.l  (a7)+,d0
  3264.     move.w  d0,(a0)+
  3265. .L4c:
  3266.     tst.w   d0
  3267.     beq     .L3
  3268.     move.b  (a3)+,(a0)+
  3269.     subq.l  #1,d0
  3270.     bra     .L4c
  3271. .L2:move.l  a0,a3
  3272.     move.w  #16,EAREQUEST
  3273.     move.l  d5,-(a7)
  3274.     bsr     EAEXP
  3275.     tst.l   d0
  3276.     bne     .OPTI
  3277.     move.w  .K4,(a4)+
  3278. .OPTI:
  3279.     move.l  (a7)+,d5
  3280.     move.w  #2,(a5)+    ; expression
  3281. .L3:cmp.w   #COM,(a3)+
  3282.     beq     .L1
  3283.     move.w  #-1,(a5)+   ; done ;)
  3284.     cmp.w   #30,-2(a3)  ; d5 now: numentries
  3285.     bne     ERROR34     ; set backwards!
  3286.     moveq   #4,D2       ; entry size
  3287.     sub.l   a2,a2       ; object
  3288.     cmp.w   #19,(a3)    ; typed?
  3289.     bne     .CNT
  3290.     addq.l  #2,a3
  3291.     move.w  (a3)+,d0
  3292.     cmp.w   #31,d0
  3293.     bne     .C1
  3294.  
  3295.     move.l  (a3),a2    ; count members and calculate size
  3296.     lea     OMEMB+4(a2),a2
  3297.     moveq   #0,d0
  3298. .C2:addq.l  #1,d0
  3299.     tst.l   ONEXT(a2)
  3300.     beq     .C3
  3301.     move.l  ONEXT(a2),a2
  3302.     bra     .C2
  3303. .C3:move.l  (a3)+,a2
  3304.     move.l  d5,d1
  3305.     lsl.w   #2,d1
  3306.     bra     .CNT
  3307. .C1:cmp.w   #IOFF+20,d0
  3308.     bmi     ERROR40
  3309.     cmp.w   #IOFF+22,d0
  3310.     bgt     ERROR40
  3311.     cmp.w   #IOFF+21,d0
  3312.     bmi     .CNT
  3313.     bgt     .CHR
  3314.     moveq   #2,d2
  3315.     bra     .CNT
  3316. .CHR:
  3317.     moveq   #1,d2
  3318. .CNT:
  3319.     cmpa.l  #0,a2
  3320.     bne     .CNT2
  3321.     move.l  d5,d1
  3322.     mulu    d2,d1
  3323. .CNT2:
  3324.     move.l  d1,-(a7)
  3325.     GETM    A0          ; 0=next
  3326.     MOVE.L  IMMLH,(A0)  ; 4=id
  3327.     MOVE.L  A0,IMMLH    ; 6=list
  3328.     addq.l  #4,a0       ; 10=size
  3329.     move.l  a0,-(a7)
  3330.     jsr     NEWLABEL
  3331.     move.l  (a7)+,a0
  3332.     move.w  d0,(a0)+
  3333.     move.l  (a7)+,d1
  3334.     addq.l  #2,d1
  3335.     move.l  d1,d0
  3336.     JSR     NEW
  3337.     move.l  d0,(a0)+
  3338.     move.l  d1,(a0)+    ; :)
  3339.     clr.l   (a0)+
  3340.     DONEM   A0
  3341.  
  3342.     move.l  IMMLH,A0
  3343.     MOVE.W  4(a0),d0
  3344.     move.w  .K1,NEWOP
  3345.     MOVE.l  .K1S,(A4)+
  3346.     move.l  a0,-(a7)
  3347.     jsr     ADDBRANCH
  3348.     move.l  (a7)+,a0
  3349.     move.l  6(a0),a0
  3350.     move.w  d5,(a0)
  3351.  
  3352.     move.l  (a7),a1
  3353.     move.w  #-1,-(a7)
  3354.     lea     OMEMB+4(a2),a6
  3355.     moveq   #0,d5
  3356.     moveq   #0,d1       ;x;
  3357. .F: cmpa.l  #0,a2
  3358.     beq     .F1
  3359.     move.l  ONEXT(a6),d0
  3360.     bne     .F0
  3361.     move.l  OMEMB(A2),d0
  3362.     moveq   #0,d1       ;x;
  3363. .F0:move.l  d0,a6
  3364.     moveq   #0,d2
  3365.     sub.w   OOFF(a6),d1 ;x;
  3366.     neg.w   d1          ;x;
  3367.     add.w   d1,d5       ;x;
  3368.     move.w  OOFF(a6),d1 ;x;
  3369.     move.w  OSIZE(a6),d2
  3370.     add.w   d2,d1       ;x;
  3371.     beq     ERROR40
  3372.     cmp.l   #4,d2
  3373.     bgt     ERROR40
  3374. .F1:moveq   #0,d0           ;
  3375.     move.w  (a1)+,d0
  3376.     cmp.w   #1,d0
  3377.     bne     .F2
  3378.     move.l  (a1)+,d0
  3379.     cmp.w   #2,d2
  3380.     blt     .Fb
  3381.     beq     .Fi
  3382.     move.l  d0,2(a0,d5)
  3383.     bra     .Fc
  3384. .Fb:move.b  d0,2(a0,d5)
  3385.     bra     .Fc
  3386. .Fi:move.w  d0,2(a0,d5)
  3387. .Fc:add.l   d2,d5
  3388.     bra     .F
  3389. .F2:cmp.w   #2,d0
  3390.     bne     .F3
  3391.  
  3392.     move.w  d5,-(a7)
  3393.     move.w  d2,-(a7)
  3394.     add.l   d2,d5
  3395.     move.l  #-1,.T0
  3396.     bra     .F
  3397.  
  3398. .F3:cmp.w   #3,d0
  3399.     bne     .F4
  3400.     move.l  a0,-(a7)
  3401.     GETM    A0
  3402.     move.l  (a1)+,4(a0)
  3403.     MOVE.L  a0,-(a7)
  3404.     bsr     NEWLABEL
  3405.     move.l  (a7)+,a0
  3406.     move.w  d0,8(a0)
  3407.     move.l  a1,-(a7)
  3408.     move.l  IMMLH,a1
  3409.     move.l  14(a1),(a0)
  3410.     move.l  a0,14(a1)
  3411.     move.l  (a7)+,a1
  3412.     move.w  d5,10(a0)
  3413.     add.l   #12,a0
  3414.     DONEM   A0
  3415.     move.l  (a7)+,a0
  3416.     add.l   d2,d5
  3417.     bra     .F
  3418.  
  3419. .F4:cmp.w   #-1,d0
  3420.     bne     ERROR0
  3421.  
  3422. .VL:
  3423.     move.w  (a7)+,d0
  3424.     cmp.w   #-1,d0
  3425.     beq     .VX
  3426.     cmp.w   #2,d0
  3427.     bmi     .VC
  3428.     beq     .VI
  3429.     move.w  .K0,(a4)+
  3430.     move.w  (a7)+,(a4)+
  3431.     bra     .VL
  3432. .VI:move.l  .K2,(a4)+
  3433.     add.w   #$2000,-2(a4)
  3434.     move.w  (a7)+,(a4)+
  3435.     bra     .VL
  3436. .VC:move.l  .K2,(A4)+
  3437.     move.w  (A7)+,(A4)+
  3438.     bra     .VL
  3439. .VX:
  3440.     move.l  (a7)+,a5
  3441.     moveq   #1,d5
  3442.     tst.l   .T0
  3443.     bne     .X2
  3444.     cmp.w   #$41FA,-4(a4)
  3445.     beq     .X2
  3446.     move.w  #$203c,-6(a4)
  3447.     bra     EXPLOOP
  3448. .X2:mOVE.L  A4,LAST_CMD_ADR
  3449.     move.w  .K3,(a4)+
  3450.     bra     EXPLOOP
  3451.  
  3452. .K0:MOVE.L  (A7)+,4(A0)
  3453. .K1:LEA     $0,A0
  3454. .K1S:
  3455.     LEA     .K1S(PC),A0
  3456. .K2:MOVE.L  (A7)+,D0
  3457.     MOVE.B  D0,4(A0)
  3458. .K3:MOVE.L  A0,D0
  3459. .K4:MOVE.L  D0,-(A7)
  3460. .T0:
  3461.     DC.L    0
  3462. IMMLH:
  3463.     DC.L    0
  3464. ; list entry struct:
  3465. ; (  0) next
  3466. ; (  4) listid [used with addreloc etc]
  3467. ; (  6) list array
  3468. ; ( 10) list size
  3469. ; ( 14) list references
  3470. STRLH:
  3471.     DC.L    0
  3472. ; string entry struct:
  3473. ; (  0) next
  3474. ; (  4) interim ptr
  3475. ; (  8) strid [used with addreloc etc]
  3476. ;*-*
  3477.   endc
  3478.  
  3479. ;; << >>
  3480. EXPSHIFT:
  3481.     CMP.W   #1,D5
  3482.     BNE     ERROR0
  3483.     MOVEQ   #3,D4
  3484.     LEA     .S(PC),A1
  3485.     CMP.W   #49,D0
  3486.     BEQ.S   .LEFT
  3487.     ADDQ.L  #4,A1
  3488. .LEFT
  3489.     MOVEQ   #0,D5
  3490.     BRA     EXPLOOP
  3491. .S: ASL.L   D1,D0
  3492.     ASL.L   #8,D0
  3493.     ASR.L   D1,D0
  3494.     ASR.L   #8,D0
  3495. ;*-*
  3496. ;; +-*/
  3497. EXPOPERATOR:
  3498.     CMP.W   #11,D0
  3499.     BPL EXPBACK
  3500.     CMP.W   #1,D5           ; 0 OPER,COMP / 1 VAL,VAR
  3501.     BNE.S   NEGVALUE
  3502. NEGBACK:
  3503.     MOVEQ   #6,D4
  3504.     CMP.W   #9,D0
  3505.     BMI.S   EXPNODP
  3506.     MOVEQ   #4,D4
  3507. EXPNODP:
  3508.     CMP.W   #-1,D5
  3509.     BNE.S   EXPNOTFIRST
  3510.     CMP.W   #8,D0
  3511.     BNE ERROR0
  3512.     TST.W   FLTFLAG
  3513.     BEQ     .0
  3514.     BTST    #1,CODEPREFS
  3515.     BEQ     .0
  3516.     MOVE.L  FEXPSTART,(A4)+
  3517.     MOVe.L  FEXPSTART+4,(A4)+
  3518.     BRA EXPNOTFIRST
  3519. .0:
  3520.     MOVE.W  EXPSTART,(A4)+
  3521. EXPNOTFIRST:
  3522.     MOVEQ   #0,D5
  3523.     SUB.W   #7,D0
  3524.     MULU    #12,D0
  3525.     EXT.L   D0
  3526.     ADD.L   #EXPPLUS,D0
  3527.     MOVE.L  D0,A1
  3528.     BRA EXPLOOP
  3529. NEGBACK1:
  3530.     SUBQ.L  #2,A3
  3531.     CMP.W   #-1,D5
  3532.     BEQ.S   NEGBACK
  3533.     BRA ERROR0
  3534.  
  3535. NEGVALUE:
  3536.     CMP.W   #8,D0
  3537.     BNE ERROR0
  3538.     CMP.W   #43,(A3)
  3539.     BEQ EXPNEGFLOAT
  3540.     CMP.W   #VALUE,(A3)+
  3541.     BNE NEGBACK1
  3542.     NEG.L   (A3)
  3543. ;*-*
  3544.  
  3545. ;; Value
  3546. EXPVALUE:             ; ENTRY
  3547.     CLR.L   LAST_CMD_ADR
  3548.     CMP.W   #1,D5
  3549.     BEQ ERROR0
  3550.     TST.W   FLTFLAG
  3551.     BNE.W   VALUEFLOAT
  3552. VALFLTBACK:
  3553.  
  3554.     TST.W   D5          ; SEE IF WE CAN OPTI CONSTS!
  3555.     BEQ.S   .1
  3556.     SUBQ.L  #2,A3
  3557.     MOVEM.L D3/D4,-(A7)
  3558.     JSR ASM_GRABVALUE
  3559.     MOVEM.L (A7)+,D3/D4
  3560.     MOVEQ   #1,D5
  3561.     BRA.S   .2
  3562.  
  3563. .1: MOVEQ   #1,D5
  3564.     MOVE.L  (A3)+,D1
  3565. .2:
  3566. VALUENTRY:            ; VAL IN D1, #1 IN D5
  3567.     CMP.L   #4,D4
  3568.     BEQ.S   SHORTBACK
  3569.     CMP.L   #3,D4
  3570.     BEQ     PASS_SHIFT1
  3571.     move.l  a4,LAST_CMD_ADR
  3572.     CMP.L   #128,D1
  3573.     BMI.W   EXPSHORT
  3574. SHORTBACK:
  3575.     MOVE.W  (A1),(A4)+
  3576.     CMP.L   #4,D4
  3577.     BEQ.S   EXPDIVPROD
  3578.     MOVE.L  D1,(A4)+
  3579.     CMP.W   #2,D4
  3580.     BNE EXPLOOP
  3581.     tst.l   d1
  3582.     bne     .1
  3583.     subq.l  #6,a4
  3584.     move.w  #$4a80,(a4)+
  3585. .1:
  3586.     MOVE.W  D3,(A4)+
  3587.     BSR EXP_EXTD0
  3588.     BRA EXPLOOP
  3589. PASS_SHIFT1:
  3590.     TST.W   D1
  3591.     BEQ     .SOPTI
  3592.     CMP.W   #8,D1
  3593.     BPL     .LSHFT
  3594.     MOVE.W  2(A1),(A4)
  3595.     LSL.W   #8,D1
  3596.     LSL.W   #1,D1
  3597.     OR.W    D1,(A4)+
  3598.     BRA     .SOPTI
  3599. .LSHFT:
  3600.     cmp.l   #-128,d1
  3601.     bmi     .KP
  3602.     cmp.l   #127,d1
  3603.     bgt     .KP
  3604.     move.w  .MOVQ(PC),(A4)
  3605.     and.w   #$FF,d1
  3606.     or.w    d1,(a4)+
  3607.     move.w  (a1),(a4)+
  3608.     bra     .SOPTI
  3609. .KP:
  3610.     MOVE.W  .MOV(PC),(A4)+
  3611.     MOVE.L  D1,(A4)+
  3612.     MOVE.W  (A1),(A4)+
  3613. .SOPTI:
  3614.     BRA EXPLOOP
  3615. .MOV:
  3616.     MOVE.L  #$0,D1
  3617. .MOVQ:
  3618.    moveq    #0,d1
  3619.  
  3620. EXPDIVPROD:
  3621.     cmpa.l  #EXPMUL,a1
  3622.     bne     .SK1
  3623.     btst    #1,ICODEPREFS+3
  3624.     beq     .SK1
  3625.     cmp.l   #30,d1
  3626.     bgt     .SK1
  3627.     cmp.l   #2,d1
  3628.     bpl     .FAST_OPTI
  3629. .SK1:
  3630.     CMP.L   #2,D1
  3631.     BEQ.S   .OPTI
  3632.     CMP.L   #4,D1
  3633.     BEQ.S   .OPTI
  3634.  
  3635.     CMP.W   #1,ECPU
  3636.     BPL     .VALDIVMUL
  3637.  
  3638.     MOVE.W  D1,(A4)+
  3639.     TST.W   D1
  3640.     BEQ ERROR15
  3641.     SWAP    D1
  3642.     TST.W   D1
  3643.     BNE.S   .2
  3644. .3: CMPA.L  #EXPMUL,A1
  3645.     BEQ.S   .1
  3646.     MOVE.W  D0EXT(PC),(A4)+
  3647. .1: BRA EXPLOOP
  3648. .2: CMP.W   #-1,D1
  3649.     BNE ERROR11
  3650.     BRA.S   .3
  3651. .OPTI:  SUBQ.L  #2,A4
  3652.     CMPA.L  #EXPMUL,A1
  3653.     BNE.S   .OPTID
  3654.     CMP.W   #2,D1
  3655.     BNE.S   .OM4
  3656.     MOVE.W  .ADD(PC),(A4)+
  3657.     BRA EXPLOOP
  3658. .OM4:   MOVE.W  .ASL(PC),(A4)+
  3659.     BRA EXPLOOP
  3660. .OPTID: CMP.W   #2,D1
  3661.     BEQ .OD2
  3662.     MOVE.L  .AS2(PC),(A4)+
  3663.     MOVE.L  .AS2+4(PC),(A4)+
  3664.     BRA EXPLOOP
  3665. .OD2:   MOVE.L  .ASR(PC),(A4)+
  3666.     MOVE.L  .ASR+4(PC),(A4)+
  3667.     BRA EXPLOOP
  3668. .ADD:   ADD.L   D0,D0
  3669. .ASL:   ASL.L   #2,D0
  3670. .ASR:   TST.L   D0
  3671.     BGE.S   .AS
  3672.     ADDQ.L  #1,D0
  3673. .AS:    ASR.L   #1,D0
  3674. .AS2:   TST.L   D0
  3675.     BGE.S   .ASS
  3676.     ADDQ.L  #3,D0
  3677. .ASS:   ASR.L   #2,D0
  3678.  
  3679. .VALDIVMUL:
  3680.     cmp.l   #EXPDIV,A1
  3681.     bne     .VALMUL
  3682.     SUBQ.L  #2,A4
  3683.     MOVE.L  #$4c7c0800,(a4)+
  3684.     move.l  d1,(a4)+
  3685.     bra EXPLOOP
  3686. .VALMUL:
  3687.     SUBQ.L  #2,A4
  3688.     MOVe.L  #$4c3c0800,(A4)+
  3689.     MOVE.L  D1,(A4)+
  3690.     BRA EXPLOOP
  3691.  
  3692.  
  3693. ;; Macro Section 1
  3694. ; some useful macros
  3695. MoveD0D2: macro
  3696.     move.w  .CODE,(a4)+
  3697.     endm
  3698. Mul2D0: macro
  3699.     move.w  .CODE+2,(A4)+
  3700.     endm
  3701. AddD2D0: macro
  3702.     move.w  .CODE+4,(A4)+
  3703.     endm
  3704. SubD2D0: macro
  3705.     move.w  .CODE+6,(a4)+
  3706.     endm
  3707. Mul2D2: macro
  3708.     move.w  .CODE+8,(a4)+
  3709.     endm
  3710. Asl3D0: macro
  3711.     move.w  .CODE+10,(a4)+
  3712.     endm
  3713. Asl4D0: macro
  3714.     move.w  .CODE+12,(a4)+
  3715.     endm
  3716. LocateCode: macro
  3717. .CODE:
  3718.     move.l  d0,d2
  3719.     add.l   d0,d0
  3720.     add.l   d2,d0
  3721.     sub.l   d2,d0
  3722.     add.l   d2,d2
  3723.     asl.l   #3,d0
  3724.     asl.l   #4,d0
  3725.     endm
  3726. ;*-*
  3727. .FAST_OPTI:
  3728.     subq.l  #2,a4
  3729. ;; *2
  3730.     cmp.l   #2,d1
  3731.     bne     .FO3
  3732.     Mul2D0
  3733.     bra     EXPLOOP
  3734. ;*-*
  3735. ;; *3
  3736. .FO3:
  3737.     cmp.l   #3,D1
  3738.     bne     .FO4
  3739.     MoveD0D2
  3740.     Mul2D0
  3741.     AddD2D0
  3742.     bra     EXPLOOP
  3743. ;*-*
  3744. ;; *4
  3745. .FO4:
  3746.     cmp.l   #4,D1
  3747.     bne     .FO5
  3748.     Mul2D0
  3749.     Mul2D0
  3750.     bra     EXPLOOP
  3751. ;*-*
  3752. ;; *5
  3753. .FO5:
  3754.     cmp.l   #5,D1
  3755.     bne     .FO6
  3756.     MoveD0D2
  3757.     Mul2D0
  3758.     Mul2D0
  3759.     AddD2D0
  3760.     bra     EXPLOOP
  3761. ;*-*
  3762. ;; *6
  3763. .FO6:
  3764.     cmp.l   #6,D1
  3765.     bne     .FO7
  3766.     Mul2D0
  3767.     MoveD0D2
  3768.     Mul2D0
  3769.     AddD2D0
  3770.     bra     EXPLOOP
  3771. ;*-*
  3772. ;; *7
  3773. .FO7:
  3774.     cmp.l   #7,D1
  3775.     bne     .FO8
  3776.     MoveD0D2
  3777.     Asl3D0
  3778.     SubD2D0
  3779.     bra     EXPLOOP
  3780. ;*-*
  3781. ;; *8
  3782. .FO8:
  3783.     cmp.l   #8,D1
  3784.     bne     .FO9
  3785.     Asl3D0
  3786.     bra     EXPLOOP
  3787. ;*-*
  3788. ;; *9
  3789. .FO9:
  3790.     cmp.l   #9,D1
  3791.     bne     .FOA
  3792.     MoveD0D2
  3793.     Asl3D0
  3794.     AddD2D0
  3795.     bra     EXPLOOP
  3796. ;*-*
  3797. ;; *10
  3798. .FOA:
  3799.     cmp.l   #10,D1
  3800.     bne     .FOB
  3801.     MoveD0D2
  3802.     Asl3D0
  3803.     Mul2D2
  3804.     AddD2D0
  3805.     bra     EXPLOOP
  3806. ;*-*
  3807. ;; *11
  3808. .FOB:
  3809.     cmp.l   #11,D1
  3810.     bne     .FOC
  3811.     MoveD0D2
  3812.     Asl3D0
  3813.     AddD2D0
  3814.     Mul2D2
  3815.     AddD2D0
  3816.     bra     EXPLOOP
  3817. ;*-*
  3818. ;; *12
  3819. .FOC:
  3820.     cmp.l   #12,D1
  3821.     bne     .FOD
  3822.     Mul2D0
  3823.     Mul2D0
  3824.     MoveD0D2
  3825.     Mul2D0
  3826.     AddD2D0
  3827.     bra     EXPLOOP
  3828. ;*-*
  3829. ;; *13
  3830. .FOD:
  3831.     cmp.l   #13,D1
  3832.     bne     .FOE
  3833.     MoveD0D2
  3834.     Asl3D0  ; *8
  3835.     AddD2D0 ; *9
  3836.     Mul2D2  ; *9
  3837.     Mul2D2  ; *9
  3838.     AddD2D0 ; *13
  3839.     bra     EXPLOOP
  3840. ;*-*
  3841. ;; *14
  3842. .FOE:
  3843.     cmp.l   #14,D1
  3844.     bne     .FOF
  3845.     MoveD0D2 ;
  3846.     Asl4D0   ; *16
  3847.     Mul2D2   ;
  3848.     SubD2D0  ; *14
  3849.     bra     EXPLOOP
  3850. ;*-*
  3851. ;; *15
  3852. .FOF:
  3853.     cmp.l   #15,D1
  3854.     bne     .FOG
  3855.     MoveD0D2
  3856.     Asl4D0
  3857.     SubD2D0
  3858.     bra     EXPLOOP
  3859. ;*-*
  3860. ;; *16
  3861. .FOG:
  3862.     cmp.l   #16,D1
  3863.     bne     .FOH
  3864.     Asl4D0
  3865.     bra     EXPLOOP
  3866. ;*-*
  3867. ;; *17
  3868. .FOH:
  3869.     cmp.l   #17,D1
  3870.     bne     .FOI
  3871.     MoveD0D2
  3872.     Asl4D0
  3873.     AddD2D0
  3874.     bra     EXPLOOP
  3875. ;*-*
  3876. ;; *18
  3877. .FOI:
  3878.     cmp.l   #18,D1
  3879.     bne     .FOJ
  3880.     Mul2D0      ; *2
  3881.     MoveD0D2
  3882.     Asl3D0      ; *2*8
  3883.     AddD2D0     ; *(2*8+2)
  3884.     bra     EXPLOOP
  3885. ;*-*
  3886. ;; *19
  3887. .FOJ:
  3888.     cmp.l   #19,D1
  3889.     bne     .FOK
  3890.     MoveD0D2 ; *:
  3891.     Asl4D0   ; 16
  3892.     AddD2D0  ; 17
  3893.     Mul2D2   ;
  3894.     AddD2D0  ; 19
  3895.     bra     EXPLOOP
  3896. ;*-*
  3897. ;; *20
  3898. .FOK:
  3899.     cmp.l   #20,D1
  3900.     bne     .FOL
  3901.     Mul2D0      ; 2
  3902.     MoveD0D2    ; *
  3903.     Asl3D0      ; 16
  3904.     AddD2D0     ; 18
  3905.     AddD2D0     ; 20
  3906.     bra     EXPLOOP
  3907. ;*-*
  3908. ;; *21
  3909. .FOL:
  3910.     cmp.l   #21,D1
  3911.     bne     .FOM
  3912.     MoveD0D2 ; *:
  3913.     Asl4D0   ; 16
  3914.     AddD2D0  ; 17
  3915.     Mul2D2   ;
  3916.     AddD2D0  ; 19
  3917.     AddD2D0  ; 21
  3918.     bra     EXPLOOP
  3919. ;*-*
  3920. ;; *22
  3921. .FOM:
  3922.     cmp.l   #22,D1
  3923.     bne     .FON
  3924.     Mul2D0      ; 2
  3925.     MoveD0D2    ; *
  3926.     Asl3D0      ; 16
  3927.     AddD2D0     ; 18
  3928.     AddD2D0     ; 20
  3929.     AddD2D0     ; 22
  3930.     bra     EXPLOOP
  3931. ;*-*
  3932. ;; *23
  3933. .FON:
  3934.     cmp.l   #23,D1
  3935.     bne     .FOO
  3936.     MoveD0D2 ; *:
  3937.     Asl4D0   ; 16
  3938.     AddD2D0  ; 17
  3939.     Mul2D2   ;
  3940.     AddD2D0  ; 19
  3941.     AddD2D0  ; 21
  3942.     AddD2D0  ; 23
  3943.     bra     EXPLOOP
  3944. ;*-*
  3945. ;; *24
  3946. .FOO:
  3947.     cmp.l   #24,D1
  3948.     bne     .FOP
  3949.     Mul2D0      ; 2
  3950.     Mul2D0      ; 4
  3951.     MoveD0D2    ; *
  3952.     Mul2D0      ; 8
  3953.     Mul2D0      ; 16
  3954.     AddD2D0     ; 20
  3955.     AddD2D0     ; 24
  3956.     bra     EXPLOOP
  3957. ;*-*
  3958. ;; *25
  3959. .FOP:
  3960.     cmp.l   #25,D1
  3961.     bne     .FOQ
  3962.     MoveD0D2 ; *:
  3963.     Asl4D0   ; 16
  3964.     AddD2D0  ; 17
  3965.     Mul2D2   ;
  3966.     Mul2D2   ;
  3967.     AddD2D0  ; 21
  3968.     AddD2D0  ; 25
  3969.     bra     EXPLOOP
  3970. ;*-*
  3971. ;; *26
  3972. .FOQ:
  3973.     cmp.l   #26,D1
  3974.     bne     .FOR
  3975.     Mul2D0      ; 2
  3976.     MoveD0D2    ; *
  3977.     Asl3D0      ; 16
  3978.     AddD2D0     ; 18
  3979.     Mul2D2
  3980.     AddD2D0     ; 22
  3981.     AddD2D0     ; 26
  3982.     bra     EXPLOOP
  3983. ;*-*
  3984. ;; *27
  3985. .FOR:
  3986.     cmp.l   #27,D1
  3987.     bne     .FOS
  3988.     MoveD0D2 ; *:
  3989.     Asl4D0   ; 16
  3990.     AddD2D0  ; 17
  3991.     Mul2D2   ;
  3992.     AddD2D0  ; 19
  3993.     Mul2D2   ;
  3994.     AddD2D0  ; 23
  3995.     AddD2D0  ; 27
  3996.     bra     EXPLOOP
  3997. ;*-*
  3998. ;; *28
  3999. .FOS:
  4000.     cmp.l   #28,D1
  4001.     bne     .FOT
  4002.     Mul2D0      ; 2
  4003.     MoveD0D2    ; *
  4004.     Asl3D0      ; 16
  4005.     Mul2D2      ;
  4006.     AddD2D0     ; 20
  4007.     AddD2D0     ; 24
  4008.     AddD2D0     ; 28
  4009.     bra     EXPLOOP
  4010. ;*-*
  4011. ;; *29
  4012. .FOT:
  4013.     cmp.l   #29,D1
  4014.     bne     .FOU
  4015.     MoveD0D2 ; *:
  4016.     Asl4D0   ; 16
  4017.     AddD2D0  ; 17
  4018.     Mul2D2   ;
  4019.     Mul2D2   ;
  4020.     AddD2D0  ; 21
  4021.     AddD2D0  ; 25
  4022.     AddD2D0  ; 29
  4023.     bra     EXPLOOP
  4024. ;*-*
  4025. ;; *30
  4026. .FOU:
  4027.     cmp.l   #30,D1
  4028.     bne     ERROR0
  4029.     Mul2D0      ; 2
  4030.     MoveD0D2    ; *
  4031.     Asl3D0      ; 16
  4032.     AddD2D0     ; 18
  4033.     Mul2D2      ;
  4034.     AddD2D0     ; 22
  4035.     AddD2D0     ; 26
  4036.     AddD2D0     ; 30
  4037.     bra     EXPLOOP
  4038. ;*-*
  4039.     LocateCode
  4040. ;*-*
  4041. ;; Float value
  4042. VALUEFLOAT:
  4043.     CLR.L   LAST_CMD_ADR
  4044.     TST.W   FLTFLAG
  4045.     BEQ .0
  4046.     BTST    #1,CODEPREFS
  4047.     BNE EXPFPVAL
  4048. .0:
  4049.     CMP.W   #-1,D5
  4050.     BEQ.W   VALFLTBACK
  4051.     CMP.L   #EXPCMP,A1      ; NO AND/OR
  4052.     BMI.W   VALFLTBACK
  4053.     BRA EXPFLOATVAL
  4054.  
  4055. EXPFPVAL:
  4056.     CMP.W   #1,D5
  4057.     BEQ     ERROR0
  4058.     CMP.L   #EXPCMP,A1      ; NO AND/OR
  4059.     BMI.W   VALFLTBACK
  4060.     CMP.W   #-1,D5
  4061.     BEQ     .FPFIRST
  4062.     moveq   #0,d1
  4063.     cmp.l   #EXPPLUS,a1
  4064.     beq     .FADD
  4065.     cmp.l   #EXPMINUS,a1
  4066.     beq     .FSUB
  4067.     cmp.l   #EXPMUL,a1
  4068.     beq     .FMUL
  4069.     cmp.l   #EXPDIV,a1
  4070.     beq     .FDIV
  4071.     cmp.l   #EXPCMP,a1
  4072.     beq     .FCMP
  4073.     bra     ERROR0
  4074. .FADD:
  4075.     cmp.w   #2,ECPU
  4076.     spl     d0
  4077.     and.l   #8,d0
  4078.     lea     .FC,a1
  4079.     add.l   d0,a1
  4080.     bra     .FFIX
  4081. .FSUB:
  4082.     cmp.w   #2,ECPU
  4083.     spl     d0
  4084.     and.l   #8,d0
  4085.     lea     .FC+16,a1
  4086.     add.l   d0,a1
  4087.     bra     .FFIX
  4088. .FMUL:
  4089.     cmp.w   #2,ECPU
  4090.     spl     d0
  4091.     and.l   #8,d0
  4092.     lea     .FC+32,a1
  4093.     add.l   d0,a1
  4094.     bra     .FFIX
  4095. .FDIV:
  4096.     cmp.w   #2,ECPU
  4097.     spl     d0
  4098.     and.l   #8,d0
  4099.     lea     .FC+48,a1
  4100.     add.l   d0,a1
  4101.     bra     .FFIX
  4102. .FCMP:
  4103.     lea     .FC+64,a1
  4104.     moveq   #-1,d1
  4105. .FFIX:
  4106.     move.l  (a1),(a4)+
  4107.     move.l  (a3)+,(a4)+
  4108.     moveq   #1,d5
  4109.     tst.l   d1
  4110.     beq     EXPLOOP
  4111.     bsr     EXPFPCMP
  4112.     bra     EXPLOOP
  4113.  
  4114. .FC:
  4115.     FADD.S  #0,fp0    ; each 8
  4116.     fsadd.s #0,fp0
  4117.     fsub.s  #0,fp0
  4118.     fssub.s #0,fp0
  4119.     fmul.s  #0,fp0
  4120.     fsglmul.s #0,fp0
  4121.     fdiv.s  #0,fp0
  4122.     fsgldiv.s #0,fp0
  4123.     fcmp.s  #0,fp0
  4124. .FPFIRST:
  4125.     move.w  #-1,FLTFLAG
  4126.     move.l  .FC2,(a4)+
  4127.     move.l  (a3)+,(a4)+
  4128.     moveq   #1,d5
  4129.     bra EXPLOOP
  4130. .FC2:   
  4131.     FSMOVE.S #0,FP0
  4132.  
  4133. EXPFLOATVAL:
  4134.     BTST    #1,CODEPREFS
  4135.     BNE     EXPFPVAL
  4136.     CMP.L   #EXPCMP,A1
  4137.     BMI ERROR0
  4138.     TST.W   D5
  4139.     BMI.S   .3
  4140.     BHI.W   ERROR0
  4141.     MOVE.W  .1(PC),(A4)+
  4142.     MOVE.L  (A3)+,(A4)+
  4143.     BSR MAKEFLTOPER
  4144.     TST.W   D0
  4145.     BNE.S   .2          ; SEE IF SPCMP
  4146.     MOVE.W  D3,(A4)+
  4147.     BSR EXP_EXTD0
  4148. .2: MOVEQ   #1,D5
  4149.     BRA EXPLOOP
  4150. .1: MOVE.L  #1,D1
  4151. .3: MOVE.W  .4(PC),(A4)+
  4152.     MOVE.L  (A3)+,(A4)+
  4153.     BRA.S   .2
  4154. .4: MOVE.L  #1,D0
  4155.  
  4156.  
  4157.  
  4158. EXPNEGFLOAT:
  4159.     ADDQ.L  #2,A3
  4160.     MOVEM.L D0-D1/A0-A1/A6,-(A7)
  4161.     BSR ISOPENMATH
  4162.     MOVE.L  MATHBASE(PC),A6
  4163.     MOVE.L  (A3),D0
  4164.     JSR -60(A6)         ; SPNEG
  4165.     MOVE.L  D0,(A3)
  4166.     MOVEM.L (A7)+,D0-D1/A0-A1/A6
  4167.     BRA.S   EXPFLOATVAL
  4168. ;*-*
  4169. ;; Short
  4170. EXPSHORT:
  4171.     CMP.L   #-128,D1
  4172.     BMI.W   SHORTBACK
  4173.     MOVE.W  (A1),D0
  4174.     CMP.W   EXPMOVE,D0
  4175.     BEQ.S   .1
  4176.     CMP.W   EXPPLUS,D0
  4177.     BEQ.S   SHORTADD
  4178.     CMP.W   EXPMINUS,D0
  4179.     BEQ.S   SHORTADD
  4180.     BRA SHORTBACK
  4181. .1: MOVE.B  EXPSTART,(A4)+
  4182.     MOVE.B  D1,(A4)+
  4183.     BRA EXPLOOP
  4184. SHORTADD:
  4185.     CMP.W   #9,D1
  4186.     BPL SHORTBACK
  4187.     CMP.W   #1,D1
  4188.     BMI SHORTBACK
  4189.     CMP.W   #8,D1
  4190.     BNE.S   SHORTNO8
  4191.     MOVEQ   #0,D1
  4192. SHORTNO8:
  4193.     CMP.W   EXPPLUS,D0
  4194.     BNE.S   SHORTSUB
  4195.     MOVE.W  EXPADDQ,D2
  4196.     ASL.W   #7,D1
  4197.     ASL.W   #2,D1
  4198.     OR.W    D1,D2
  4199.     MOVE.W  D2,(A4)+
  4200.     BRA EXPLOOP
  4201. SHORTSUB:
  4202.     CMP.W   EXPMINUS,D0
  4203.     BNE SHORTBACK
  4204.     MOVE.W  EXPSUBQ,D2
  4205.     ASL.W   #7,D1
  4206.     ASL.W   #2,D1
  4207.     OR.W    D1,D2
  4208.     MOVE.W  D2,(A4)+
  4209.     BRA EXPLOOP
  4210. ;*-*
  4211. ;; Variables
  4212. EXPVAR:
  4213.     CLR.L   LAST_CMD_ADR
  4214.     CMP.W   #1,D5
  4215.     BEQ ERROR0
  4216.     MOVE.L  (A3)+,A0
  4217.     MOVE.L  A0,LASTVAR
  4218.     MOVE.W  (A3),D0         ; CHECK COMPLEX
  4219.     CMP.W   #11,2(A3)
  4220.     BEQ     EXPEXT
  4221. EXPEXTBACK:
  4222.     CMP.W   #33,D0          ; ++/--
  4223.     BPL EXPVARC
  4224.     CMP.W   #29,D0          ; []
  4225.     BEQ EXPVARC
  4226.     CMP.W   #41,D0          ; ::
  4227.     BEQ EXPVARC
  4228.     CMP.W   #17,D0          ; ()
  4229.     BEQ EXPOWNFUNC
  4230. EXPVARCBACK:
  4231.     CMP.W   #ASSGN,(A3)     ; :=
  4232.     BEQ EXPVARASSIGN
  4233. EXPVARASSBACK:
  4234.     MOVE.L  A4,LAST_CMD_ADR
  4235.     MOVE.W  10(A0),D0       ; D0=VAROFFSET
  4236.     MOVE.B  4(A0),D2        ; D2=TYPE
  4237.     CMP.B   #3,D2
  4238.     BEQ ERROR23
  4239.     CMP.W   #2,D4
  4240.     BEQ EXPVARCMP
  4241.     CMP.W   #3,D4
  4242.     BEQ .SHIFT
  4243.     TST.W   FLTFLAG
  4244.     BNE .2
  4245. .4: CMP.W   #4,D4           ; TAKE LOWWORD IF MULU/DIVU
  4246.     BNE.S   .1
  4247.     CMP.W   #1,ECPU
  4248.     BPL     .VARDIVMUL
  4249.     ADDQ.W  #2,D0
  4250.     OPINT
  4251. .1: MOVE.W  0(A1,D4.W),(A4)+
  4252.     BSR GVA0D0D5_0
  4253.     OPLONG
  4254.     MOVEQ   #1,D5
  4255.     CMPA.L  #EXPDIV,A1
  4256.     BNE EXPLOOP
  4257.     MOVE.W  D0EXT(PC),(A4)+
  4258.     BRA EXPLOOP
  4259.  
  4260. .VARDIVMUL:
  4261.     clr.w   (a4)+
  4262.     CMPA.L  #EXPDIV,A1
  4263.     BNE     .VARMUL
  4264.     MOVE.W  #$4c6d,(A4)+
  4265.     MOVE.L  A4,-(A7)
  4266.     BSR GVA0D0_0
  4267.     MOVEq   #0,d0
  4268.     move.l  (a7)+,d2
  4269.     CMP.L   A4,D2
  4270.     beq     .VDM1
  4271.     MOVE.W  -(A4),D0
  4272. .VDM1:
  4273.     move.w  -(a4),-(a4)
  4274.     addq.l  #2,a4
  4275.     move.w  #$0800,(a4)+
  4276.     TST.W   D0
  4277.     BEQ     .VDM2
  4278.     MOVE.W  D0,(A4)+
  4279. .VDM2:
  4280.     MOVEQ   #1,D5
  4281.     BRA EXPLOOP
  4282. .VARMUL:
  4283.     MOVE.W  #$4c2d,(A4)+
  4284.     MOVE.L  A4,-(a7)
  4285.     BSR GVA0D0_0
  4286.     MOVEq   #0,d0
  4287.     move.l  (a7)+,d2
  4288.     CMP.L   A4,D2
  4289.     beq     .VDM1
  4290.     MOVE.W  -(A4),D0
  4291.     BRA     .VDM1
  4292.  
  4293.  
  4294. .SHIFT:
  4295.     MOVE.W  .3(PC),(A4)+
  4296.     BSR GVA0D0D5_0
  4297.     MOVEQ   #1,D5
  4298.     MOVE.W  (A1),(A4)+
  4299.     BRA EXPLOOP
  4300. .3: MOVE.L  2(A5),D1
  4301. .2:
  4302.     CMP.L   #EXPCMP,A1      ; NO AND/OR
  4303.     BMI .4
  4304.     BTST    #1,CODEPREFS
  4305.     BNE EXPFPVAR
  4306.     CMP.W   #-1,D5          ; SPXXX
  4307.     BEQ .4
  4308. BLERK:
  4309.     MOVE.W  .3(PC),(A4)+
  4310.     BSR GVA0D0D5_0
  4311.     MOVEQ   #1,D5
  4312.     BSR MAKEFLTOPER
  4313.     BRA EXPLOOP
  4314. .3: MOVE.L  2(A5),D1
  4315.  
  4316. EXPFPVAR:
  4317.     cmp.w   #-1,D5
  4318.     bne     .FNOT1ST
  4319.     moveq   #0,d1
  4320.     cmp.w   #2,ECPU
  4321.     spl     d0
  4322.     and.l   #6,d0
  4323.     lea     .FC0,a1
  4324.     add.l   d0,a1
  4325.     bra     .FFIX
  4326. .FC0:
  4327.     FMOVE.S  2(A5),FP0
  4328.     FSMOVE.S 2(a5),FP0
  4329.  
  4330. .FNOT1ST:
  4331.     moveq   #0,d1
  4332.     CMP.L   #EXPPLUS,A1
  4333.     BEQ     .FADD
  4334.     CMP.L   #EXPMINUS,A1
  4335.     BEQ     .FSUB
  4336.     CMP.L   #EXPDIV,A1
  4337.     BEQ     .FDIV
  4338.     CMP.L   #EXPMUL,A1
  4339.     BEQ     .FMUL
  4340.     CMP.L   #EXPCMP,A1
  4341.     BEQ     .FCMP
  4342.     BRA     ERROR0
  4343. .FADD:
  4344.     cmp.w   #2,ECPU
  4345.     spl     d0
  4346.     and.l   #6,d0
  4347.     lea     .FC1,a1
  4348.     add.l   d0,a1
  4349.     bra     .FFIX
  4350. .FSUB:
  4351.     cmp.w   #2,ECPU
  4352.     spl     d0
  4353.     and.l   #6,d0
  4354.     lea     .FC1+12,a1
  4355.     add.l   d0,a1
  4356.     bra     .FFIX
  4357. .FMUL:
  4358.     cmp.w   #2,ECPU
  4359.     spl     d0
  4360.     and.l   #6,d0
  4361.     lea     .FC1+24,a1
  4362.     add.l   d0,a1
  4363.     bra     .FFIX
  4364. .FDIV:
  4365.     cmp.w   #2,ECPU
  4366.     spl     d0
  4367.     and.l   #6,d0
  4368.     lea     .FC1+36,a1
  4369.     add.l   d0,a1
  4370.     bra     .FFIX
  4371. .FCMP:
  4372.     lea     .FC1+48,a1
  4373.     moveq   #-1,d1
  4374. .FFIX:
  4375.     move.w  (a1),(a4)+
  4376.     move.l  a4,a2
  4377.     jsr     GVA0D0_0
  4378.     cmp.l   a4,a2
  4379.     bne     .FFIX2
  4380.     move.w  2(a1),(a4)+
  4381.     moveq   #1,d5
  4382.     bra     .FXIT
  4383. .FFIX2:
  4384.     move.w  -(a4),d0
  4385.     move.w  2(a1),(a4)+
  4386.     move.w  d0,(a4)+
  4387.     moveq   #1,d5
  4388. .FXIT:
  4389.     tst.l   d1
  4390.     bpl     EXPLOOP
  4391.     bsr     EXPFPCMP
  4392.     bra     EXPLOOP
  4393.  
  4394. .FC1:
  4395.     fadd.s  2(a5),fp0
  4396.     fsadd.s 2(a5),fp0
  4397.     fsub.s  2(a5),fp0
  4398.     fssub.s 2(a5),fp0
  4399.     fmul.s  2(a5),fp0
  4400.     fsglmul.s 2(a5),fp0
  4401.     fdiv.s  2(a5),fp0
  4402.     fsgldiv.s 2(a5),fp0
  4403.     fcmp.s  2(a5),fp0
  4404.  
  4405. EXPEXT:
  4406.     CMP.W   #-1,D5
  4407.     BNE     EXPEXTBACK
  4408.     CMP.W   #7,D0
  4409.     BEQ     .PARSE
  4410.     CMP.W   #8,D0
  4411.     BEQ     .PARSE
  4412.     CMP.W   #9,D0
  4413.     BEQ     .PARSE
  4414.     CMP.W   #10,D0
  4415.     BEQ     .PARSE
  4416.     CMP.W   #49,D0
  4417.     BEQ     .PARSE
  4418.     CMP.W   #50,D0
  4419.     BEQ     .PARSE
  4420.     CMP.W   #IOFF+29,D0
  4421.     BEQ     .PARSE
  4422.     CMP.W   #IOFF+30,D0
  4423.     BEQ     .PARSE
  4424.     BRA     EXPEXTBACK
  4425. .PARSE:
  4426.     ADDQ.L  #4,A3
  4427.     MOVEM.L D0-A2/A5/A6,-(A7)
  4428.     BSR     EXP
  4429.     MOVEM.L (A7)+,D0-A2/A5/A6
  4430.     BTST.B  #3,5(A0)
  4431.     BNE     .REGVAR
  4432.  
  4433.     CMP.W   #9,D0
  4434.     BMI     .GOOD
  4435.     CMP.W   #IOFF+29,D0
  4436.     BPL     .GOOD
  4437.     MOVE.W  .C1(PC),(A4)+
  4438.     BSR     GVA0D1_0
  4439.     SUB.W   #9,D0
  4440.     CMP.W   #2,D0
  4441.     BMI.S   .S1
  4442.     SUB.W   #38,D0
  4443. .S1:LSL.L   #1,D0
  4444.  
  4445.     MOVE.W  .C2(PC,D0),(A4)+
  4446.     MOVE.W  .C1+4(PC),(A4)+
  4447.     BSR     GVA0D2_9
  4448.     MOVE.W  .C1+8(PC),(A4)+
  4449.     MOVEQ   #1,D5
  4450.     BRA EXPLOOP
  4451. .C1:MOVE.L  -4(A5),D1
  4452.     MOVE.L  D1,-4(A5)
  4453.     MOVE.L  D1,D0
  4454. .C2:MULS.W  D0,D1
  4455.     DIVS.W  D0,D1
  4456.     ASL.L   D0,D1
  4457.     ASR.L   D0,D1
  4458. .C3:ADD.L   D0,-4(A5)
  4459.     SUB.L   D0,-4(A5)
  4460.     AND.L   D0,-4(A5)
  4461.     OR.L    D0,-4(A5)
  4462. .GOOD:
  4463.     BTST.B  #3,5(A0)
  4464.     BNE     .REGVAR
  4465.     SUb.W   #7,D0
  4466.     cmp.w   #2,d0
  4467.     bmi     .S2
  4468.     sub.w   #IOFF+20,D0
  4469. .S2:LSL.L   #2,D0
  4470.     MOVE.W  .C3(PC,D0),(A4)+
  4471.     BSR GVA0D1_0
  4472.     MOVEQ   #1,D5
  4473.     BRA EXPLOOP
  4474.  
  4475.     MOVE.W  (A3),2(A3)
  4476.     MOVE.L  -4(A3),-2(A3)
  4477.     MOVE.W  -6(A3),-4(A3)
  4478.     SUBQ.L  #6,A3
  4479.     MOVE.W  #ASSGN,(A3)
  4480.     BRA     EXPVARASSIGN
  4481. .T1:DC.W    7,8,9,10,49,50,IOFF+29,IOFF+30,-1
  4482.  
  4483. .REGVAR:
  4484.     LEA     .T1(PC),A2
  4485.     moveq   #0,d2
  4486. .R01:
  4487.     MOVE.W  (a2)+,d1
  4488.     cmp.w   d1,d0
  4489.     beq     .R02
  4490.     addq.l  #1,d2
  4491.     bra     .R01
  4492. .C4:
  4493.     ADD.L   D0,D0
  4494.     SUB.L   D0,D0
  4495.     MULS    D0,D0
  4496.     DIVS    D0,D0
  4497.     ASL.L   d0,D0
  4498.     ASR.L   D0,D0
  4499.     ANd.L   D0,D0
  4500.     OR.L    D0,D0
  4501. .C5:
  4502.     MULS.L  D0,D0
  4503.     DIVS.L  D0,D0
  4504.     MOVE.L  D0,D0
  4505. .R02:
  4506.     lsl.w   #1,d2
  4507.     MOVE.W  .C4(PC,d2),(A4)+
  4508.     MOVE.W  10(A0),D0
  4509.  
  4510.     cmp.w   #1,ECPU
  4511.     blt     .R001
  4512.     cmp.w   #2*2,d2
  4513.     bmi     .R001
  4514.     cmp.w   #3*2,d2
  4515.     bgt     .R001
  4516.     subq.l  #2*2,d2
  4517.     lsl.w   #1,d2
  4518.     subq.l  #2,a4
  4519.     move.L  .C5(PC,D2),(A4)+
  4520.     or.w    D0,-2(A4)
  4521.     lsl.w   #8,d0
  4522.     lsl.w   #4,d0
  4523.     bra     .R002
  4524. .R001:
  4525.     cmp.w   #4*2,d2
  4526.     beq     .R002
  4527.     cmp.w   #5*2,d2
  4528.     beq     .R002
  4529.     LSL.L   #8,d0
  4530.     lsl.l   #1,d0
  4531. .R002:
  4532.     or.w    d0,-2(A4)
  4533.     MOVEQ   #1,d5
  4534.     move.w  .C5+8(PC),(A4)
  4535.     MOVE.W  10(A0),D0
  4536.     OR.W    D0,(A4)+
  4537.     BRA EXPLOOP
  4538.  
  4539.  
  4540. LASTVAR:
  4541.     DC.L    0
  4542. ;*-*
  4543. ;; < <= = => > <>
  4544. EXPVARCMP:
  4545.     CLR.L   LAST_CMD_ADR
  4546.     TST.W   FLTFLAG
  4547.     BNE .1
  4548.     MOVE.W  6(A1),(A4)+
  4549.     BSR GVA0D0D5_0
  4550.     MOVEQ   #1,D5
  4551.     MOVE.W  D3,(A4)+
  4552.     BSR EXP_EXTD0
  4553.     BRA EXPLOOP
  4554.  
  4555. .1:
  4556. BLAARGH:
  4557.     BTST    #1,CODEPREFS
  4558.     BNE     .FLOAT
  4559.  
  4560.     MOVE.W  .2(PC),(A4)+        ; SPCMP
  4561.     BSR GVA0D0D5_0
  4562.     BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
  4563.     MOVEQ   #1,D5
  4564.     MOVE.L  .3(PC),(A4)+
  4565.     MOVE.L  .3+4(PC),(A4)+
  4566.     MOVE.W  D3,(A4)+
  4567.     BSR EXP_EXTD0
  4568.     BRA EXPLOOP
  4569. .2: MOVE.L  2(A5),D1
  4570. .3: MOVE.L  -56(A4),A6
  4571.     JSR -42(A6)
  4572. .FLOAT:
  4573.     MOVEQ   #1,D5
  4574.     move.w  .FC,(a4)+
  4575.     move.l  a4,a2
  4576.     bsr GVA0D0D5_0
  4577.     cmp.l   a4,a2
  4578.     bne .F2
  4579.     move.w  .FC+2,(a4)+
  4580.     bra .F3
  4581. .F2:move.w  -(a4),d0
  4582.     move.w  .FC+2,(a4)+
  4583.     move.w  d0,(a4)+
  4584. .F3:bsr     EXPFPCMP
  4585.     bra     EXPLOOP
  4586. .FC:
  4587.     fcmp.s  2(a5),fp0
  4588. ;*-*
  4589. ;; FPCmp
  4590. EXPFPCMP:
  4591.     lea     EXPCMP,a1
  4592.     CMP.W   #3,EFPU
  4593.     BEQ .FLOAT_2
  4594.     lsl.l   #2,d3
  4595.     LEA     .FPCMP(PC),A0
  4596.     MOVE.L  (A0,D3),(A4)+
  4597.     BSR EXP_EXTD0
  4598.     RTS
  4599. .FLOAT_2:
  4600.     lsl.l   #2,d3
  4601.     MOVE.W  #$70FF,(A4)+
  4602.     LEA     .FPCMP2(PC),A0
  4603.     MOVE.L  (A0,D3),(A4)+
  4604.     move.w  #$7000,(a4)+
  4605.     RTS
  4606.  
  4607. .FPCMP:
  4608.     FSEQ    D0
  4609.     FSGT    D0
  4610.     FSLT    D0
  4611.     FSGE    D0
  4612.     FSLE    D0
  4613.     FSNE    D0
  4614. .FPCMP2:
  4615.     FBEQ    *+6
  4616.     FBGT    *+6
  4617.     FBLT    *+6
  4618.     FBGE    *+6
  4619.     FBLE    *+6
  4620.     FBNE    *+6
  4621. ;*-*
  4622. ;; :: .
  4623. EXPVARC:
  4624.     CLR.L   LAST_CMD_ADR
  4625.     CMP.W   #41,D0
  4626.     BEQ.S   .3
  4627.     CMP.W   #36,D0
  4628.     BPL EXPVARCBACK
  4629. .3: TST.B   4(A0)
  4630.     BEQ ERROR22
  4631.     CMP.B   #LAB,4(A0)
  4632.     BEQ ERROR6
  4633.     CMP.W   #42,2(A3)
  4634.     BEQ     .2
  4635.     MOVEQ   #1,D0
  4636.     SUBQ.L  #6,A3
  4637.     TST.W   D5
  4638.     BMI     .i0
  4639.     TST.W   FLTFLAG
  4640.     BEQ     .i0
  4641.     BTST    #1,CODEPREFS
  4642.     BEQ     .i0
  4643.     MOVE.L  .c0,(A4)+
  4644. .i0:
  4645.     BSR EADDRESSMODI
  4646.     TST.W   D5
  4647.     BMI     .i1
  4648.     TST.W   FLTFLAG
  4649.     BEQ     .i1
  4650.     BTST    #1,CODEPREFS
  4651.     BEQ     .i1
  4652.     MOVE.L  .c1,(A4)+
  4653. .i1:
  4654.     TST.W   FLTFLAG
  4655.     BEQ     .0
  4656.     BTST    #1,CODEPREFS
  4657.     BEQ     .0
  4658.     addq.l  #1,d5
  4659.     lsl.l   #2,d5
  4660.     move.l  .C0(PC,D5.w),(a4)+
  4661.     lsr.l   #2,d5
  4662.     subq.l  #1,d5
  4663.     cmp.w   #-1,d5
  4664.     beq .C1
  4665.     bsr MAKEFLTOPER
  4666.     tst.w   d0
  4667.     bne     .C1
  4668.     bsr EXPFPCMP
  4669. .C1:
  4670.     moveq   #1,d5
  4671.     bra EXPLOOP
  4672.     bra     .0
  4673. .C0:
  4674.     FMOVE.S D0,FP0
  4675.     FMOVE.S D1,FP1
  4676.  
  4677. .0: CMP.W   #-1,D5
  4678.     BEQ     .1
  4679.     BSR CLOSEEXP
  4680. .1: MOVEQ   #1,D5
  4681.     BRA EXPLOOP
  4682. .2: CMP.W   #35,D0
  4683.     BNE     .3
  4684.     TST.B   4(A0)
  4685.     BEQ ERROR22
  4686.     ADDQ.L  #2,A3
  4687.     MOVE.L  A0,METHODIDENT      ; DO METHOD CALL HERE!
  4688.     BSR SD0
  4689.     CLR.L   METHODSPEC
  4690.     BSR.S   EXPCALLMETHOD
  4691.     BSR RD0
  4692.     MOVEQ   #1,D5
  4693.     BRA EXPLOOP
  4694.  
  4695. .c0:FMOVE.S FP0,D0
  4696. .c1:FMOVE.S D0,FP0
  4697.  
  4698. METHODIDENT:    DC.L    0
  4699. METHODSPEC: DC.L    0
  4700. METHODFREEZ:    DC.L    0   ; FROZEN CALL WITH THIS OBJECT
  4701. ;*-*
  4702. ;; FindMethod
  4703. ; WANTS   OBJ=A6,NAME=D0
  4704. ; TRASHES A0
  4705. ; RETURNS D1=METHOD | NIL
  4706.  
  4707. FINDMETHOD:
  4708.     LEA OMETHOD(A6),A6
  4709.     MOVE.L  A6,D1
  4710. .XL:MOVE.L  D1,A6
  4711.     MOVE.L  (A6),D1
  4712.     BEQ .ERR
  4713.     MOVE.L  D1,A6
  4714.     MOVE.L  M_NAME(A6),A0
  4715.     MOVE.L  D0,A6
  4716. .CL:    CMPM.B  (A0)+,(A6)+
  4717.     BNE.S   .XL
  4718.     TST.B   -1(A0)
  4719.     BNE.S   .CL
  4720. .ERR:   RTS
  4721. ;*-*
  4722. ;; CallMethod
  4723. EXPCALLMETHOD:            ; IDENTENTRY IN METHODIDENT,
  4724.     CMP.W   #42,(A3)+       ; A3 JUST PAST "."
  4725.     BNE ERROR40
  4726.     MOVE.L  METHODSPEC(PC),D0
  4727.     BNE.S   .NS1
  4728.     MOVE.L  METHODIDENT(PC),A6
  4729.     MOVE.L  (A6),D0
  4730. .NS1:   CMP.L   #5,D0
  4731.     BMI ERROR40
  4732.     MOVE.L  D0,A6           ; A6=OBJECT
  4733.     MOVE.L  (A3)+,D0        ; D0=NAME
  4734.     BSR FINDMETHOD
  4735.     TST.L   D1
  4736.     BEQ .ERR
  4737.     MOVE.L  METHODSPEC(PC),-(A7)
  4738.     BEQ.S   .MS4
  4739.     MOVE.W  .SA0(PC),(A4)+
  4740. .MS4:   MOVE.L  METHODFREEZ(PC),-(A7)
  4741.     MOVE.L  D1,-(A7)        ; STACK: S.L, F.L, M.L, I.L, COUNT.W
  4742.     CMP.W   #17,(A3)+
  4743.     BNE ERROR23
  4744.     MOVE.L  METHODIDENT,-(A7)
  4745.     CLR.W   -(A7)
  4746.     CMP.W   #18,(A3)
  4747.     BEQ.S   .2
  4748. .3: MOVE.W  #16,EAREQUEST
  4749.     BSR EAEXP
  4750.     TST.L   D0
  4751.     BNE.S   .OPT
  4752.     MOVE.W  .4(PC),(A4)+
  4753. .OPT:   ADDQ.W  #4,(A7)
  4754.     CMP.W   #COM,(A3)+
  4755.     BEQ.S   .3
  4756.     SUBQ.L  #2,A3
  4757. .2: CMP.W   #18,(A3)+       ; OUT
  4758.     BNE ERROR23
  4759.  
  4760.     MOVEQ   #0,D0
  4761.     MOVE.W  (A7)+,D0        ; D0=ARGCOUNT
  4762.     MOVE.L  4(A7),A6
  4763.     MOVE.L  M_PROC(A6),A6
  4764.     BSR DODEFARGS
  4765.  
  4766.     MOVE.L  (A7)+,A0        ; A0.L=IDENT
  4767.     MOVE.L  (A7)+,A6        ; A6.L=METHOD
  4768.     MOVE.L  (A7)+,METHODFREEZ
  4769.     MOVE.L  (A7)+,METHODSPEC
  4770.     BNE.W   .MS2
  4771.     MOVE.W  .7(PC),(A4)+
  4772.     BSR GVA0D1_0
  4773.     MOVE.L  (A0),A0         ; A0=OBJ
  4774.     BRA.S   .MS3
  4775. .MS2:   MOVE.L  METHODSPEC(PC),A0
  4776.     MOVE.W  .GA0(PC),(A4)+
  4777.     MOVE.W  D0,(A4)+
  4778.     ADDQ.W  #4,D0
  4779. .MS3:
  4780.     TST.L   METHODFREEZ
  4781.     BNE.S   .FR
  4782.  
  4783.     TST.W   ODELOFF(A0)
  4784.     BMI ERROR71
  4785.     BHI .U
  4786.     MOVE.W  .6(PC),(A4)+
  4787. .UB:    BRA.S   .NFR
  4788.  
  4789. .FR:    MOVEM.L A0/A6,-(A7)     ; FREEZ!
  4790.     MOVE.L  METHODFREEZ(PC),A6
  4791.     GETM    A0          ; ADD TO SUPER-ACCESS
  4792.     MOVE.L  OACC(A6),(A0)
  4793.     MOVE.L  A0,OACC(A6)
  4794.     ADDQ.L  #4,A0
  4795.     MOVE.W  .GOBJ(PC),(A4)+     ; GEN: PUT SUPER-DEL IN a1
  4796.     MOVE.L  A4,(A0)+
  4797.     CLR.W   (A4)+
  4798.     CLR.W   (A0)+
  4799.     DONEM   A0
  4800.     MOVEM.L (A7)+,A0/A6
  4801.  
  4802. .NFR:   MOVE.W  .6A(PC),(A4)+
  4803.     MOVE.W  M_OFF(A6),(A4)+
  4804.     MOVE.W  .6B(PC),(A4)+
  4805.     TST.W   D0
  4806.     BEQ.S   .NOA
  4807.     MOVE.W  .5(PC),(A4)+
  4808.     MOVE.W  D0,(A4)+
  4809. .NOA:   RTS
  4810. .4: MOVE.L  D0,-(A7)
  4811. .5: LEA -8(A7),A7
  4812. .7: MOVEA.L 2(A5),A0
  4813. .6: MOVE.L  (A0),A1
  4814. .6X:    MOVE.L  2(A0),A1
  4815. .6A:    MOVE.L  4(A1),A1
  4816. .6B:    JSR (A1)
  4817. .U: MOVE.W  .6X(PC),(A4)+
  4818.     MOVE.W  ODELOFF(A0),(A4)+
  4819.     BRA.W   .UB
  4820. .SA0:   MOVE.L  A0,-(A7)
  4821. .GA0:   MOVE.L  2(A7),A0
  4822. .ERR:   CMP.W   #17,(A3)
  4823.     BEQ ERROR54
  4824.     BRA ERROR42
  4825. .GOBJ:  MOVE.L  4(A4),A1
  4826. ;*-*
  4827. ;; :=
  4828. EXPVARASSIGN:         ; VAR STILL IN A0
  4829.     CMP.W   #-1,D5
  4830.     BNE EXPVARASSBACK
  4831.     ADDQ.L  #2,A3
  4832.     TST.W   EXPLCHECK
  4833.     BNE.W   .CH
  4834. .CHB:
  4835.     MOVE.L  A0,-(A7)
  4836.     BSR EXP
  4837.     MOVE.L  (A7)+,A0
  4838.     MOVE.B  4(A0),D2
  4839.     BEQ ERROR22
  4840.     CMP.B   #LAB,D2
  4841.     BEQ ERROR6
  4842.     MOVE.W  .1(PC),(A4)+
  4843.     BSR GVA0D5_9
  4844.     MOVEQ   #1,D5
  4845.     BRA EXPLOOP
  4846. .1: MOVE.L  D0,2(A5)
  4847. .CH:BTST    #3,5(A0)
  4848.     BEQ.W   .CHB
  4849.     MOVE.W  10(A0),D0
  4850.     MOVE.W  EXPLMASK,D1
  4851.     BTST    D0,D1
  4852.     BEQ.W   .CHB
  4853.     BRA ERROR25
  4854.  
  4855. ;*-*
  4856. ;; MakeFloatOper
  4857.  
  4858. MAKEFLTOPER:          ; TRASHES D0 !!!!
  4859.     BTST    #1,CODEPREFS
  4860.     BNE .MAKEFPOPER
  4861.     BSET    #3,CODEPREFS+1      ; USE MATHIEEESINGBAS
  4862.     MOVE.L  A1,D0
  4863.     SUB.L   #EXPCMP,D0
  4864.     DIVU    #3,D0
  4865.     MOVE.L  .2(PC),(A4)+
  4866.     MOVE.L  .1(PC,D0.W),(A4)+
  4867.     RTS
  4868. .1: JSR -42(A6)         ; = <> etc.
  4869.     JSR -66(A6)         ; +
  4870.     JSR -72(A6)         ; -
  4871.     JSR -78(A6)         ; *
  4872.     JSR -84(A6)         ; /
  4873. .MAKEFPOPER:
  4874.     CMP.W   #1,FINISHFPEXP
  4875.     BEQ     .MAKEFP1
  4876.     MOVE.L  A1,D0
  4877.     SUB.L   #EXPCMP,D0
  4878.     DIVU    #3,D0
  4879.     MOVe.L  .3(PC,D0),(A4)+
  4880.     RTS
  4881. .CHK:
  4882.     FMOVE.L D0,FP0
  4883. .3: FCMP.X  FP1,FP0
  4884.     FADD.X  FP1,FP0
  4885.     FSUB.X  FP1,FP0
  4886.     FMUL.X  FP1,FP0
  4887.     FDIV.X  FP1,FP0
  4888. .MAKEFP1:
  4889.     addq.l  #2,d1
  4890.     MOVE.W  #0,FINISHFPEXP      ; D1 = other reg
  4891.     MOVE.L  A1,D0
  4892.     SUB.L   #EXPCMP,D0
  4893.     DIVU    #3,D0
  4894.     MOVe.L  .4(PC,D0),(A4)+
  4895.     lsl.w   #7,d1
  4896.     or.w    d1,-2(a4)
  4897.     tst.l   d0
  4898.     beq .C
  4899.     move.l  .5(PC),(a4)+
  4900.     lsl.w   #3,d1
  4901.     or.w    d1,-2(a4)
  4902. .C:
  4903.     TST.W   D0
  4904.     SNE D0
  4905.     EXT.W   D0
  4906.     MOVE.W  D0,FLTFLAG
  4907.     RTS
  4908.  
  4909. .4: FCMP.X  FP0,FP0
  4910.     FADD.X  FP0,FP0
  4911.     FSUB.X  FP0,FP0
  4912.     FMUL.X  FP0,FP0
  4913.     FDIV.X  FP0,FP0
  4914. .5: FMOVE.X FP0,FP0
  4915. .2: MOVE.L  -56(A4),A6
  4916.  
  4917. ;*-*
  4918. ;; parse < <= = => > <>
  4919. EXPCOMPARATOR:
  4920.  
  4921.     CMP.W   #17,D0
  4922.     BPL EXPBACK2
  4923.     CMP.W   #11,D0
  4924.     BNE.S   .00
  4925.     CMP.W   #11,(A3)
  4926.     BEQ     EXP_CHECK
  4927. .00:
  4928.     CMP.W   #1,D5
  4929.     BNE .1
  4930.     CMP.W   #12,D0
  4931.     BEQ.S   .2
  4932. .3: TST.W   FLTFLAG
  4933.     BEQ .3_0
  4934.     BTST    #1,CODEPREFS
  4935.     BNE .FLT
  4936. .3_0:
  4937.     MOVEQ   #0,D5
  4938.     LEA EXPEQ(PC),A0
  4939.     MOVE.L  D0,D1
  4940.     SUB.W   #11,D1
  4941.     ASL.W   #1,D1
  4942.     MOVE.W  0(A0,D1.W),D3
  4943.     LEA EXPCMP(PC),A1
  4944.     MOVEQ   #2,D4
  4945.     BRA EXPLOOP
  4946. .1: CMP.W   #13,D0
  4947.     BEQ EXPCONS
  4948.     CMP.W   #16,D0
  4949.     BEQ EXPCONSNIL
  4950.     BRA ERROR0
  4951. .FLT:
  4952.     MOVE.L  D0,D3
  4953.     SUB.W   #11,D3
  4954.     EXT.L   D3
  4955.     MOVEQ   #2,D4
  4956.     LEA EXPCMP(PC),A1
  4957.     MOVEQ   #0,D5
  4958.     BRA EXPLOOP
  4959. .2: CMP.W   #2,EXPRECC      ; ONLY IF EXP IN EXP
  4960.     BMI.S   .3
  4961.     MOVE.W  (A3),D1
  4962.     CMP.W   #1,D1
  4963.     BMI.S   .4
  4964.     CMP.W   #COM,D1
  4965.     BEQ.S   .4
  4966.     CMP.W   #12,D1
  4967.     BEQ.S   .4
  4968.     CMP.W   #18,D1
  4969.     BEQ.S   .4
  4970.     CMP.W   #30,D1
  4971.     BEQ.S   .4
  4972.     CMP.W   #40,D1
  4973.     BEQ.S   .4
  4974.     CMP.W   #46,D1
  4975.     BEQ.S   .4
  4976.     CMP.W   #IOFF+18,D1
  4977.     BEQ.S   .4
  4978.     CMP.W   #IOFF+55,D1
  4979.     BEQ.S   .4
  4980.     BRA     .3
  4981. .4: BRA EXPOUT
  4982. ;*-*
  4983. ;; & || AND OR
  4984. EXPLOG:
  4985.     CMP.W   #IOFF+31,D0
  4986.     BPL ANDORNOTBACK
  4987.     CMP.W   #1,D5
  4988.     BNE ERROR0
  4989. ;   TST.W   FLTFLAG
  4990. ;   BNE ERROR0  ; NO AND/OR FLOAT
  4991.     MOVEQ   #0,D5
  4992.     MOVEQ   #6,D4
  4993.     SUB.W   #IOFF+29,D0
  4994.     MULU    #12,D0
  4995.     EXT.L   D0
  4996.     ADD.L   #EXPAND,D0
  4997.     MOVE.L  D0,A1
  4998.     BRA EXPLOOP
  4999. ;*-*
  5000.  
  5001. ;; Commands
  5002. EXPEQ:
  5003.     SEQ D0          ; = 11
  5004.     SGT D0          ; > 12
  5005.     SLT D0          ; < 13
  5006.     SGE D0          ; >=    14
  5007.     SLE D0          ; <=    15
  5008.     SNE D0          ; <>    16
  5009.  
  5010. EXPSTART:   MOVEQ   #0,D0
  5011.  
  5012. EXPAND:
  5013.     AND.L   #0,D0       ; 0
  5014.     AND.L   2(A5),D0    ; 6
  5015.     AND.L   D1,D0       ; 10
  5016. EXPOR:
  5017.     OR.L    #0,D0
  5018.     OR.L    2(A5),D0
  5019.     OR.L    D1,D0
  5020. EXPCMP:
  5021.     CMP.L   #0,D0
  5022.     CMP.L   2(A5),D0
  5023.     CMP.L   D1,D0
  5024. EXPPLUS:              ; NO CHANGES TO THESE 8 !
  5025.     ADD.L   #0,D0           ; EACH 12
  5026.     ADD.L   2(A5),D0
  5027.     ADD.L   D1,D0
  5028. EXPMINUS:
  5029.     SUB.L   #0,D0
  5030.     SUB.L   2(A5),D0
  5031.     SUB.L   D1,D0
  5032. EXPMUL:
  5033.     MULS    #0,D0
  5034.     MULS    2(A5),D0
  5035.     MULS    D1,D0
  5036.     DC.W    0
  5037. EXPDIV:
  5038.     DIVS    #0,D0
  5039.     DIVS    2(A5),D0
  5040.     DIVS    D1,D0
  5041.     dc.w    0
  5042. EXPMOVE:
  5043.     MOVE.L  #0,D0
  5044.     MOVE.L  2(A5),D0
  5045.     MOVE.L  D1,D0
  5046.  
  5047. EXPADDQ:    ADDQ.L  #8,D0
  5048. EXPSUBQ:    SUBQ.L  #8,D0
  5049. ;*-*
  5050.  
  5051. ;; Procedure
  5052. EXPOWNFUNC:           ; A0=IDENTENTRY
  5053.     CLR.L   LAST_CMD_ADR
  5054.     BTST    #4,5(A0)
  5055.     BNE ERROR4
  5056.     CMP.B   #LAB,4(A0)
  5057.     BNE EXPVARPROCCALL
  5058.     MOVE.L  6(A0),A6        ; A6=PROC!!
  5059.     MOVE.L  A6,D6
  5060.  
  5061.     MOVEQ   #0,D0
  5062.     BTST    #5,2(A6)
  5063.     BEQ     .skippars
  5064.     MOVE.L  6(A6),A6
  5065.     MOVE.W  (A6)+,D1
  5066.     subq.l  #1,d1
  5067.  
  5068. .check:
  5069.     CMP.B   #4,(A6)
  5070.     BNE     .chk1
  5071.     CMP.B   #3,1(A6)
  5072.     BMI     .chk1
  5073.     MOVEQ   #15,d2
  5074.     sub.b   1(a6),d2
  5075.     bset    d2,d0
  5076.     moveq   #16,d2
  5077.     add.b   1(a6),d2
  5078.     bset    d2,d0
  5079. .chk1:
  5080.     addq.l  #2,a6
  5081.     dbf     d1,.check
  5082.  
  5083.     tst.w   d0
  5084.     beq     .skippars
  5085.     move.w  #$48e7,(a4)+
  5086.     move.w  d0,(a4)+
  5087.  
  5088. .skippars:
  5089.     swap    d0
  5090.     move.w  d0,-(a7)
  5091.     MOVE.L  D6,A6
  5092.     TST.L   D6
  5093.     BEQ ERROR25
  5094.     CMP.W   #17,(A3)+
  5095.     BNE ERROR23
  5096.     BSR SD0
  5097.     MOVEQ   #0,D0           ; #OF ARGS
  5098.     CMP.W   #18,(A3)
  5099.     BEQ.S   .2
  5100. .3: MOVEM.L D0/A0/A6,-(A7)
  5101.     MOVE.W  #16,EAREQUEST
  5102.     BSR EAEXP
  5103.     TST.L   D0
  5104.     BNE.S   .OPT
  5105.     MOVE.W  .4(PC),(A4)+
  5106. .OPT:   MOVEM.L (A7)+,D0/A0/A6
  5107.     ADDQ.L  #4,D0
  5108.     CMP.W   #COM,(A3)+
  5109.     BEQ.S   .3
  5110.     SUBQ.L  #2,A3
  5111. .2: CMP.W   #18,(A3)+       ; OUT
  5112.     BNE ERROR23
  5113.     BSR DODEFARGS
  5114.     MOVEM.L D0/A0,-(A7)
  5115.  
  5116.     MOVE.W  10(A0),D0
  5117.     BMI.S   .MINM
  5118.     MOVE.L  .1(PC),(A4)+
  5119.     MOVE.W  .1L(PC),NEWOP
  5120.     MOVE.W  .1L2(PC),NEWOP020
  5121.     BSR ADDBRANCH
  5122.     BRA.S   .D
  5123. .MINM:  MOVE.W  .1L(PC),(A4)+       ; ADR OF LABEL OF OTHER MODULE
  5124.     MOVEM.L A1/A6,-(A7)
  5125.     GETM    A6
  5126.     MOVE.L  VARHEAVY(A0),A1     ; A1=PTR TO PROCCLASS
  5127.     MOVE.L  PC_ACC(A1),D0
  5128.     MOVE.L  A6,PC_ACC(A1)
  5129.     MOVE.L  D0,(A6)+
  5130.     MOVE.L  A4,(A6)+
  5131.     DONEM   A6
  5132.     MOVEM.L (A7)+,A1/A6
  5133.     CLR.L   (A4)+
  5134. .D:
  5135.     MOVEM.L (A7)+,D0/A0
  5136.     MOVE.L  6(A0),A6
  5137.     TST.W   (A6)
  5138.     BEQ.S   .NOA
  5139.     BTST    #0,2(A6)
  5140.     BNE.S   .NOA
  5141.     BTST    #5,2(A6)
  5142.     BNE.S   .NOA
  5143.     cmp.w   #8,d0
  5144.     ble     .DOSTK
  5145.     MOVE.W  .5(PC),(A4)+
  5146.     MOVE.W  D0,(A4)+
  5147.     bra     .NOA
  5148. .DOSTK:
  5149.     and.l   #7,d0
  5150.     lsl.w   #8,d0
  5151.     lsl.w   #1,d0
  5152.     or.w    .5o,d0
  5153.     move.w  d0,(a4)+
  5154.     bra     .NOA
  5155. .NOA:
  5156.     MOVED0FP0
  5157.     BSR RD0
  5158.     move.w  (a7)+,d0
  5159.     tst.w   d0
  5160.     beq     .exit
  5161.     move.w  #$4cdf,(a4)+
  5162.     move.w  d0,(a4)+
  5163. .exit:
  5164.     MOVEQ   #1,D5
  5165.     BRA EXPLOOP
  5166. .1: BSR .1
  5167. .1L:    JSR .1
  5168. .1L2:   BSR.L .1
  5169. .4: MOVE.L  D0,-(A7)
  5170. .5: ADDa.w  #8,a7
  5171. .5o:addq.l  #8,a7
  5172. DOREGARGS:
  5173.     MOVE.L  D0,D6
  5174.     LSR.L   #2,D6
  5175.     CMP.W   (A6),D6
  5176.     BNE     ERROR23
  5177.     move.l  6(a6),a6
  5178.     subq.l  #1,d6
  5179.  
  5180.     move.w  (a6)+,d0
  5181.     lsl.w   #1,d0
  5182.     add.w   d0,a6
  5183.     lsr.w   #1,d0
  5184. .L1:
  5185.     subq.l  #2,a6
  5186.     cmp.b   #5,(a6)
  5187.     seq     d0
  5188.     and.l   #$40,d0
  5189.     ror.l   #8,d0
  5190.     move.b  1(a6),d0
  5191.     and.w   #7,d0
  5192.     lsl.w   #1,d0
  5193.     rol.l   #8,d0
  5194.     move.w  .C1(PC),(A4)
  5195.     or.w    d0,(a4)+
  5196.  
  5197.     dbf     d6,.L1
  5198.  
  5199.     rts
  5200. .C1:
  5201.     MOVe.L  (A7)+,D0
  5202.  
  5203.  
  5204.  
  5205. DODEFARGS:
  5206.     BTST    #5,2(A6)
  5207.     BNE     DOREGARGS
  5208.     MOVE.L  D0,D6           ; DEAL WITH DEFARGS
  5209.     LSR.L   #2,D6
  5210.     CMP.W   (A6),D6
  5211.     BEQ.S   .R
  5212.     BPL ERROR23
  5213.     MOVE.W  (A6),D0
  5214.     EXT.L   D0
  5215.     LSL.L   #2,D0
  5216.     SUB.W   (A6),D6
  5217.     NEG.W   D6          ; D6=NARG WE STILL NEED
  5218.     MOVE.L  6(A6),A6
  5219.     MOVE.L  A6,D7
  5220.     BEQ ERROR23
  5221.     MOVE.W  (A6)+,D7
  5222.     BEQ ERROR23
  5223.     SUB.W   D6,D7
  5224.     BMI ERROR23
  5225.     LSL.W   #2,D7
  5226.     EXT.L   D7
  5227.     ADD.L   D7,A6
  5228.     SUBQ.L  #1,D6
  5229. .DAL:   MOVE.L  (A6)+,D7
  5230.     SWAP    D7
  5231.     TST.W   D7
  5232.     BEQ.S   .DP0
  5233.     CMP.W   #-1,D7
  5234.     BEQ.S   .DP1
  5235. .LP:    SWAP    D7
  5236.     MOVE.W  .P2(PC),(A4)+
  5237.     MOVE.L  D7,(A4)+
  5238.     BRA.S   .N
  5239. .DP0:   TST.L   D7
  5240.     BMI.S   .LP
  5241.     BRA.S   .DP
  5242. .DP1:   TST.L   D7
  5243.     BPL.S   .LP
  5244. .DP:    SWAP    D7
  5245.     MOVE.W  .P1(PC),(A4)+
  5246.     MOVE.W  D7,(A4)+
  5247. .N: DBRA    D6,.DAL
  5248. .R: RTS
  5249. .P1:    PEA $0.W
  5250. .P2:    PEA $0
  5251. ;*-*
  5252. ;; Var proc
  5253. EXPVARPROCCALL:           ; A0=IDENTENTRY
  5254.     CLR.L   LAST_CMD_ADR
  5255.     CLR.W   .F
  5256.     TST.B   4(A0)
  5257.     BEQ ERROR22
  5258.     CMP.W   #17,(A3)+
  5259.     BNE ERROR23
  5260.     BSR SD0
  5261.     MOVE.L  A0,-(A7)
  5262.     CLR.W   -(A7)
  5263.     CMP.W   #18,(A3)
  5264.     BEQ.S   .2
  5265.     MOVEQ   #0,D0
  5266.     MOVEQ   #0,D1
  5267.     cmp.b   #4,(a3)
  5268.     seq d0
  5269.     cmp.b   #5,(a3)
  5270.     seq d1
  5271.     or.w    d0,d1
  5272.     move.w  d1,.F
  5273.     moveq   #0,d1
  5274. .3: addq.l  #1,d1
  5275.     CMP.B   #4,(A3)
  5276.     BLT     .3_1
  5277.     CMP.B   #5,(A3)
  5278.     BGT     .3_1
  5279.     MOVE.W  (A3)+,-(A7)
  5280.     cmp.w   #11,(a3)+
  5281.     bne ERROR0
  5282.     tst.w   .F
  5283.     beq ERROR50
  5284.     BRA .3_2
  5285. .3_1:
  5286.     TST.W   .F
  5287.     BNE ERROR50
  5288. .3_2:
  5289.     MOVE.W  #16,EAREQUEST
  5290.     move.l  d1,-(a7)
  5291.     BSR EAEXP
  5292.     move.l  (a7)+,d1
  5293.     TST.L   D0
  5294.     BNE.S   .OPT
  5295.     MOVE.W  .4(PC),(A4)+
  5296. .OPT:
  5297.     ADDQ.W  #4,(A7)
  5298.     CMP.W   #COM,(A3)+
  5299.     BEQ.S   .3
  5300.     SUBQ.L  #2,A3
  5301. .2: TST.W   .F
  5302.     BNE     .FIXREGS
  5303.     CMP.W   #18,(A3)+       ; OUT
  5304.     BNE ERROR23
  5305.     MOVE.W  (A7)+,D0
  5306.     MOVE.L  (A7)+,A0
  5307.     MOVE.W  .7(PC),(A4)+
  5308.     BSR GVA0D1_0
  5309.     MOVE.W  .6(PC),(A4)+
  5310.     TST.W   D0
  5311.     BEQ.S   .NOA
  5312.     MOVE.W  .5(PC),(A4)+
  5313.     MOVE.W  D0,(A4)+
  5314. .NOA:
  5315.     MOVED0FP0
  5316.     BSR RD0
  5317.     MOVEQ   #1,D5
  5318.     BSET    #5,WARNINGS+3
  5319.     BRA EXPLOOP
  5320. .FIXREGS:
  5321.     SUBQ.L  #1,d1
  5322. .L1: move.w  (a7)+,d2
  5323.     ror.l   #8,d2
  5324.     cmp.b   #5,d2
  5325.     seq d0
  5326.     rol.l   #8,d2
  5327.     and.l   #$40,d0
  5328.     and.l   #7,d2
  5329.     bchg    #2,d2
  5330.     cmp.w   #4,d2
  5331.     blt     .L2
  5332.     cmp.w   #6,d2
  5333.     beq .L2
  5334.     cmp.w   #$40,d0
  5335.     beq     ERROR50
  5336. .L2:lsl.w   #8,d2
  5337.     lsl.w   #1,d2
  5338.     move.w  .0(PC),(a4)
  5339.     or.w    d2,(a4)
  5340.     or.w    d0,(a4)+
  5341.     dbf d1,.L1
  5342.  
  5343.     CMP.W   #18,(A3)+       ; OUT
  5344.     BNE ERROR23
  5345.     MOVE.W  (A7)+,D0
  5346.     MOVE.L  (A7)+,A0
  5347.     MOVE.W  .A(PC),(A4)+
  5348.     MOVE.W  .8(PC),(A4)+
  5349.     BSR GVA0D1_0
  5350.     MOVE.W  .9(PC),(A4)+
  5351.     MOVE.W  .C(PC),(A4)+
  5352.  
  5353.     BSR VP
  5354.  
  5355.     BSR RD0
  5356.     MOVEQ   #1,D5
  5357.     BSET    #5,WARNINGS+3
  5358.     BRA EXPLOOP
  5359.  
  5360.  
  5361. .4: MOVE.L  D0,-(A7)
  5362. .5: adda.w  #8,a7
  5363. .7: MOVEA.L 2(A5),A0
  5364. .6: JSR (A0)
  5365. .8: MOVE.L 2(A5),A5
  5366. .9: JSR (A5)
  5367. .0: MOVE.L  (A7)+,D0
  5368. .A: MOVE.L  A5,-(A7)
  5369. .C: MOVE.L  (A7)+,A5
  5370. .F: DC.W    0
  5371. VP:
  5372.     MOVED0FP0
  5373.     RTS
  5374.  
  5375.  
  5376. ;*-*
  5377. ;; Library
  5378. NUMRECSAVE = 8
  5379.  
  5380. EXPLIBCALL:
  5381.     CLR.L   LAST_CMD_ADR
  5382.     CMP.W   #1,D5
  5383.     BEQ ERROR0
  5384.     LEA EXPLCHECK(PC),A0    ; HERE WE CHECK LOOPED CALLS!
  5385.     TST.W   (A0)
  5386.     BEQ.S   .1          ; NO NEED TO
  5387.     MOVEQ   #NUMRECSAVE-1,D0
  5388. .2: MOVE.L  (A0)+,-(A7)     ; SHOVE NUMRECSAVE LONGS UP STACK
  5389.     DBRA    D0,.2
  5390. .1: SUB.L   A6,A6           ; NEED OF REGS
  5391.     MOVE.W  (A3)+,EXPLBASE
  5392.     MOVE.W  (A3)+,EXPLOFF
  5393.     MOVE.L  (A3)+,A2
  5394.     MOVE.W  (A3)+,D2
  5395.     MOVE.W  (A3)+,EXPLEXCEPT
  5396.     MOVE.W  D2,EXPLMASK
  5397.     MOVEQ   #0,D0           ; D0=# OF REGS
  5398.     LEA EXPLREGS(PC),A0
  5399.     MOVE.W  D5,-(A7)        ; SAVE D5
  5400. EXPLLOOP:
  5401.     MOVEQ   #0,D1
  5402.     MOVE.B  (A2)+,D1        ; D1=REG#
  5403.     CMP.W   #16,D1
  5404.     BPL.S   EXPLNEXT
  5405.     ADDQ.L  #1,D0
  5406.     MOVEQ   #13,D6
  5407.     MOVEQ   #0,D7           ; D7=POS
  5408.     CMP.W   #12,D1
  5409.     BMI .1          ; A4/A5 CALL
  5410.     ADDQ.L  #1,A6
  5411. .1: MOVEQ   #13,D5
  5412.     SUB.W   D6,D5
  5413.     CMP.W   D1,D5
  5414.     BEQ.S   .X
  5415.     BTST    D5,D2
  5416.     BEQ.S   .2
  5417.     ADDQ.L  #1,D7
  5418. .2: DBRA    D6,.1
  5419. .X: MOVE.B  D7,(A0)+
  5420.     BRA.S   EXPLLOOP
  5421. EXPLNEXT:
  5422.     MOVE.W  (A7)+,D5        ; RESTORE D5
  5423.     MOVE.B  #-1,(A0)+
  5424.     MOVE.W  D0,EXPLNUM
  5425.     CMP.W   #17,(A3)+       ; CHECK INCOMING (
  5426.     BNE ERROR0
  5427. .CONTINUE:
  5428.     BSR SD0
  5429.     TST.W   EXPLNUM
  5430.         BEQ.S   EXPLNOARGS
  5431.         BSR.S   EXPLIBARG
  5432.         BRA.S   EXPLFIN
  5433. EXPLNOARGS:
  5434.     BSR.W   EXPLIBJSR
  5435. EXPLFIN:
  5436.  
  5437.     MOVE.W  EXPLEXCEPT(PC),D7   ; USE D7/A6
  5438.     BMI.S   .NR
  5439.     MULU    #10,D7
  5440.     MOVE.L  #LIBRAISE,A6
  5441.     LEA 0(A6,D7.W),A6
  5442.     BSR EXPRAISE
  5443. .NR:
  5444.     MOVED0FP0
  5445.     BSR RD0
  5446.     ADDQ.L  #2,A3           ; EAT )
  5447.     MOVEQ   #1,D5
  5448.     LEA EXPLCHECK(PC),A0    ; PUT LOOPED CALLS BACK AGAIN
  5449.     TST.W   (A0)
  5450.     BEQ.S   .3          ; NO NEED TO
  5451.     LEA NUMRECSAVE*4(A0),A0
  5452.     MOVEQ   #NUMRECSAVE-1,D0
  5453. .2: MOVE.L  (A7)+,-(A0)
  5454.     DBRA    D0,.2
  5455. .3: BRA EXPLOOP
  5456.  
  5457. EXPLIBARG:            ; IN CASE OF Func(arg,...)
  5458.     LSAVER  EXPLMASK,D1
  5459.     MOVE.W  D1,EXPLRSM
  5460.     CMP.W   #0,A6
  5461.     BEQ.S   .1
  5462.     MOVE.L  SAVE45(PC),(A4)+    ; NO OPTI IF A4/A5 USED
  5463.     BRA.S   .2
  5464. .1:
  5465.     TST.W   D1          ; NO OPTI IF D3-D7 USED
  5466.     BNE.S   .2
  5467.  
  5468.     MOVE.L  A3,D1           ; CHECK IF OPTI POSSIBLE
  5469. .XL:MOVE.W  (A3)+,D0
  5470.     CMP.W   #8,D0
  5471.     BNE.S   .T1
  5472.     CMP.W   #VALUE,(A3)+
  5473.     BNE.S   .XB
  5474.     ADDQ.L  #4,A3
  5475.     BRA.S   .C
  5476. .T1:    CMP.W   #VALUE,D0
  5477.     BNE.S   .T2
  5478.     ADDQ.L  #4,A3
  5479.     BRA.S   .C
  5480. .T2:    CMP.W   #IDENT,D0
  5481.     BNE.S   .T3
  5482.     ADDQ.L  #4,A3
  5483.     BRA.S   .C
  5484. .T3:    CMP.W   #STR,D0
  5485.     BNE.S   .XB
  5486.     ADDQ.L  #2,A3
  5487.     MOVE.W  (A3)+,D7
  5488.     LSL.W   #1,D7
  5489.     ADD.W   D7,A3
  5490.     BTST    #2,CODEPREFS+3
  5491.     BNE.S   .XB
  5492. .C: CMP.W   #COM,(A3)+
  5493.     BEQ.S   .XL
  5494.     CMP.W   #18,-2(A3)
  5495.     BNE.S   .XB
  5496.     MOVEQ   #-1,D0
  5497.     BRA.S   .O
  5498. .XB: MOVEQ   #0,D0
  5499. .O: MOVE.L  D1,A3
  5500.  
  5501. ; OPTFLAG NOW IN D0, CHOOSE BETWEEN TWO:
  5502.  
  5503.     TST.L   D0
  5504.     BNE OPTIARGS
  5505.  
  5506. .2: MOVE.W  EXPLNUM(PC),D0
  5507.     MOVE.W  D0,D1
  5508.     MULU    #-4,D1
  5509.     btst    #1,ICODEPREFS+3
  5510.     bne     .O1
  5511.     MOVE.W  EXPGETSTACK(PC),(A4)+
  5512.     BRA     .O2
  5513. .O1:move.w  EXPGETSTACKF(PC),(a4)+
  5514. .O2:MOVE.W  D1,(A4)+
  5515.     SUBQ.W  #1,D0
  5516.     LEA EXPLREGS(PC),A0
  5517. EXPLARGLOOP:
  5518.     MOVEM.L D0/A0/A6,-(A7)
  5519.     MOVE.W  EXPLCHECK(PC),-(A7)
  5520.     MOVE.W  #-1,EXPLCHECK
  5521.     bclr    #2,ICODEPREFS+3
  5522.     BSR EXP
  5523.     MOVE.W  (A7)+,EXPLCHECK     ; RESTORE PREVIOUS VALUE
  5524.     MOVEM.L (A7)+,D0/A0/A6
  5525.     MOVE.B  (A0)+,D1
  5526.     EXT.W   D1
  5527.     LSL.W   #2,D1
  5528.     btst    #2,ICODEPREFS+3
  5529.     bne     .NO_OPT
  5530.     TST.L   LAST_CMD_ADR
  5531.     bne     .TRY_OPTI
  5532. .NO_OPT:
  5533.     tst.l   d1
  5534.     beq     .1
  5535.     MOVE.W  EXPTOSTACK(PC),(A4)+
  5536.     MOVE.W  D1,(A4)+
  5537.     bra     .DONE_OPT
  5538. .1: move.w  #$2e80,(a4)+        ; move.l    d0,(a7)
  5539. .DONE_OPT:
  5540.     TST.W   D0
  5541.     BEQ     EXPLARGOUT
  5542.     CMP.W   #COM,(A3)+
  5543.     BNE ERROR5
  5544.     DBRA    D0,EXPLARGLOOP
  5545.     BRA     EXPLARGOUT
  5546. .TRY_OPTI:
  5547.     move.l  a2,-(a7)
  5548.     move.l  a4,d2
  5549.     sub.l   LAST_CMD_ADR,d2
  5550.     cmp.l   #2,d2
  5551.     beq     .TRY2
  5552.     cmp.l   #4,d2
  5553.     beq     .TRY4
  5554.     cmp.l   #6,d2
  5555.     bne     .NO_OPTI
  5556.     move.l  LAST_CMD_ADR,a2
  5557.     cmp.w   #$203c,(a2)         ;move.l #xxxx,yy(a7)
  5558.     bne     .NO_OPTI
  5559.     move.l  a2,a4
  5560.     tst.w   d1
  5561.     beq     .2
  5562.     move.w  #$2f7c,(a4)+
  5563.     addq.l  #4,a4
  5564.     move.w  d1,(a4)+
  5565.     bra     .DONE_OPTI
  5566. .2: move.w  #$2ebc,(a4)+
  5567.     addq.l  #4,a4
  5568.     bra     .DONE_OPTI
  5569. .TRY2:
  5570.     move.l  LAST_CMD_ADR,a2
  5571.     cmp.w   #$7000,(a2)
  5572.     bne     .NO_OPTI
  5573.     move.l  a2,a4
  5574.     tst.w   d1
  5575.     beq     .3
  5576.     move.w  #$42af,(a4)+
  5577.     move.w  d1,(a4)+
  5578.     bra     .DONE_OPTI
  5579. .3: move.w  #$4297,(a4)+
  5580.     bra     .DONE_OPTI
  5581. .TRY4:
  5582.     move.l  LAST_CMD_ADR,a2
  5583.     move.w  (a2),d2
  5584.     and.l   #$FFFE,d2
  5585.     cmp.w   #$202c,d2
  5586.     bne     .NO_OPTI
  5587.     move.l  a2,a4
  5588.     move.w  (a2),d2
  5589.     and.l   #1,d2
  5590.     tst.l   d1
  5591.     beq     .4
  5592.     or.w    #$2f6c,d2
  5593.     move.w  d2,(a4)+
  5594.     addq.l  #2,a4
  5595.     move.w  d1,(a4)+
  5596.     bra     .DONE_OPTI
  5597. .4: or.w    #$2eac,d2
  5598.     move.w  d2,(a4)+
  5599.     addq.l  #2,a4
  5600.     bra     .DONE_OPTI
  5601. .NO_OPTI:
  5602.     move.l  (a7)+,a2
  5603.     bra     .NO_OPT
  5604. .DONE_OPTI:
  5605.     move.l  (a7)+,a2
  5606.     bra     .DONE_OPT
  5607.  
  5608. EXPLARGOUT:
  5609.     MOVE.W  EXPGETBASE(PC),(A4)+
  5610.     MOVE.W  EXPLBASE(PC),D0
  5611.     BSR DOOFF
  5612.     MOVE.W  D0,(A4)+
  5613.     MOVE.W  EXPMOVEM(PC),(A4)+
  5614.     MOVE.W  EXPLMASK(PC),(A4)+
  5615.     MOVE.W  EXPJSR(PC),(A4)+
  5616.     MOVE.W  EXPLOFF(PC),(A4)+
  5617.     CMP.W   #0,A6
  5618.     BEQ.S   .1
  5619.     MOVE.L  RETRIEVE45(PC),(A4)+
  5620. .1: MOVE.W  EXPLRSM(PC),D0
  5621.     RESTR   D0
  5622.     RTS
  5623.  
  5624. OPTIARGS:
  5625.     MOVE.W  EXPLNUM(PC),D0
  5626.     SUBQ.W  #1,D0
  5627.     MOVE.L  -10(A3),A0
  5628. .1: MOVE.B  (A0)+,D1
  5629.     MOVEM.L D0/A0/A6,-(A7)
  5630.     MOVE.W  EXPLCHECK(PC),-(A7)
  5631.     MOVE.W  #-1,EXPLCHECK
  5632.     EXT.W   D1
  5633.     MOVE.W  D1,EAREQUEST
  5634.     BSR     EAEXP
  5635.     TST.L   D0
  5636.     BEQ.S   .3
  5637.     MOVE.W  (A7)+,EXPLCHECK
  5638.     MOVEM.L (A7)+,D0/A0/A6
  5639.     TST.W   D0
  5640.     BEQ.S   .2
  5641.     CMP.W   #COM,(A3)+
  5642.     BNE ERROR5
  5643.     DBRA    D0,.1
  5644. .2: MOVE.W  EXPGETBASE(PC),(A4)+
  5645.     MOVE.W  EXPLBASE(PC),D0
  5646.     BSR DOOFF
  5647.     MOVE.W  D0,(A4)+
  5648.     MOVE.W  EXPJSR(PC),(A4)+
  5649.     MOVE.W  EXPLOFF(PC),(A4)+
  5650.     RTS
  5651. .3: INTERN  100
  5652.  
  5653. EXPLIBJSR:            ; IN CASE OF Func()
  5654.     MOVE.W  EXPGETBASE(PC),(A4)+
  5655.     MOVE.W  EXPLBASE(PC),D0
  5656.     BSR DOOFF
  5657.     MOVE.W  D0,(A4)+
  5658.     MOVE.W  EXPJSR(PC),(A4)+
  5659.     MOVE.W  EXPLOFF(PC),(A4)+
  5660.     RTS
  5661.  
  5662. EXPJSR:       JSR -30(A6)
  5663. EXPGETBASE:   MOVE.L  -40(A4),A6
  5664. EXPGETSTACK:  adda.w #4,A7
  5665. EXPGETSTACKF: add.w #4,A7
  5666. EXPMOVEM:     MOVEM.L (A7)+,D0/A0
  5667. EXPTOSTACK:   MOVE.L  D0,4(A7)
  5668. SAVE45:       MOVEM.L A4/A5,-(A7)
  5669. RETRIEVE45:   MOVEM.L (A7)+,A4/A5
  5670.  
  5671. EXPLCHECK:    DC.W    0   ; NOTE: THESE DATA=NUMRECSAVE LONGS!
  5672. EXPLBASE:     DC.W    0
  5673. EXPLOFF:      DC.W    0
  5674. EXPLMASK:     DC.W    0
  5675. EXPLNUM:      DC.W    0
  5676. EXPLEXCEPT:   DC.W    0
  5677. EXPLOPTI:     DC.W    0
  5678. EXPLRSM:      DC.W    0
  5679. EXPLREGS:     DC.L    0,0,0,0
  5680. ;*-*
  5681. ;; EFunction
  5682. EXPEFUNC:
  5683.     CLR.L   LAST_CMD_ADR
  5684.     CMP.W   #1,D5
  5685.     BEQ ERROR0
  5686.     MOVE.L  (A3)+,A0        ; A0=FUNCTABENTRY
  5687.  
  5688.     MOVE.L  A0,D0
  5689.     SUB.L   #EFUNCTAB,D0
  5690.     DIVU    #EFUNCENTRYSIZE,D0
  5691.     LSL.W   #2,D0
  5692.     LEA     EFUNCFLAGSTAB,A6
  5693.     MOVE.L  0(A6,D0),D2
  5694.     BTST    #8,D2
  5695.     BNE     EXPINLINE
  5696.  
  5697.     MOVEQ   #0,D0           ; D0=COUNT ARGS
  5698.     MOVEQ   #-100,D2
  5699.     TST.L   8(A0)           ; WRITEF/PRINTF?
  5700.     BPL.S   .3
  5701.     MOVE.L  8(A0),D2
  5702.     SUBQ.L  #1,D2
  5703.     ASL.L   #2,D2
  5704. .3: CMP.W   #17,(A3)+
  5705.     BNE ERROR23
  5706.     BSR SD0
  5707.     SUBA.L  A6,A6           ; NO BACKPATCH SOFAR
  5708.  
  5709. .1: CMP.W   #18,(A3)
  5710.     BEQ.S   .2
  5711.     ADDQ.L  #4,D2
  5712.     BMI.S   .4
  5713.     TST.L   D2
  5714.     BNE.S   .1C
  5715.     MOVE.L  A4,A6           ; A6=BACKPATCH
  5716.     MOVE.L  .LEA(PC),(A4)+
  5717. .1C:    MOVEM.L A0/D0/D2/A6,-(A7)
  5718.     BSR.W   EXP
  5719.     MOVEM.L (A7)+,A0/D0/D2/A6
  5720.     TST.L   D2
  5721.     BNE.S   .1B
  5722.     MOVE.W  WRITEFARG+4(PC),(A4)+
  5723.     BRA.S   .6
  5724. .1B:    MOVE.W  WRITEFARG(PC),(A4)+
  5725.     MOVE.W  D2,(A4)+
  5726.     BRA.S   .6
  5727. .4: MOVEM.L A0/D0/D2/A6,-(A7)
  5728.     MOVE.W  #16,EAREQUEST
  5729.     BSR.W   EAEXP
  5730.     TST.L   D0
  5731.     BNE.S   .NUS
  5732.     MOVE.W  UPSTACK(PC),(A4)+
  5733. .NUS:   MOVEM.L (A7)+,A0/D0/D2/A6
  5734. .6: ADDQ.L  #1,D0
  5735.     CMP.W   #COM,(A3)+
  5736.     BEQ.S   .1
  5737.     SUBQ.L  #2,A3
  5738.  
  5739. .2: TST.L   8(A0)
  5740.     BMI.S   .5
  5741.     CMP.L   8(A0),D0
  5742.     BEQ .DAB
  5743.     BSR EFUNDA
  5744. .DAB:   BRA.S   .5B
  5745. .5: CMP.L   #-4,D2          ; ATLEAST 1-3 ARGS
  5746.     BMI ERROR23
  5747.     MOVE.L  A6,D1
  5748.     BEQ.S   .5C
  5749.     ADDQ.L  #4,D2
  5750.     NEG.L   D2
  5751.     MOVE.W  D2,2(A6)
  5752. .5C:    MOVE.L  D0,D2
  5753.     ADD.L   8(A0),D2
  5754.     ADDQ.L  #1,D0
  5755.     LSL.L   #2,D2
  5756.     MOVE.W  .P(PC),(A4)+
  5757.     MOVE.W  D2,(A4)+
  5758. .5B:    MOVE.L  EFUNCJUMP(PC),(A4)+
  5759.     MOVE.L  D0,D2
  5760.     MOVE.L  A0,D0
  5761.     SUB.L   #EFUNCTAB,D0
  5762.     DIVU.W  #EFUNCENTRYSIZE,D0
  5763.     LSL.W   #2,D0
  5764.  
  5765.     MOVE.L  A0,-(A7)
  5766.     LEA     EFUNCFLAGSTAB,A0
  5767.     MOVE.L  0(A0,D0),D7
  5768.     BTST    #0,D7
  5769.     BEQ.S   .T0
  5770.     BSET    #3,CODEPREFS+1
  5771. .T0:BTST    #1,D7
  5772.     BEQ.S   .T1
  5773.     BSET    #4,CODEPREFS+1
  5774. .T1:BTST    #2,D7
  5775.     BEQ     .T2
  5776.     CMP.W   #37,OSVERSION
  5777.     BLT     ERROR78
  5778. .T2:BTST    #3,D7
  5779.     BEQ     .T3
  5780.     CMP.W   #39,OSVERSION
  5781.     BLT     ERROR78
  5782. .T3:BTST    #4,D7
  5783.     BEQ     .T4
  5784.     CMP.W   #1,ECPU
  5785.     BLT     ERROR53
  5786. .T4:BTST    #5,D7
  5787.     BEQ     .T5
  5788.     CMP.W   #2,ECPU
  5789.     BLT     ERROR53
  5790. .T5:BTST    #6,D7
  5791.     BEQ     .T6
  5792.     CMP.W   #1,EFPU
  5793.     BLT     ERROR53
  5794. .T6:BTST    #7,D7
  5795.     BEQ     .T7
  5796.     CMP.W   #2,EFPU
  5797.     BLT     ERROR53
  5798. .T7:BTST    #8,D7
  5799.     BEQ     .T8
  5800.     BTST    #7,CODEPREFS
  5801.     BEQ     ERROR0
  5802. .T8:BTST    #10,D7
  5803.     BEQ     .T9
  5804.     BSET    #3,CODEPREFS
  5805. .T9:BTST    #11,D7
  5806.     BEQ     .TA
  5807.     BTST    #6,CODEPREFS
  5808.     BEQ     ERROR85
  5809. .TA:
  5810.     MOVE.L  (A7)+,A0
  5811.  
  5812.     LSR.W   #2,D0
  5813.     MOVE.L  D0,D7           ; INDEX
  5814.     ADD.W   #10,D0
  5815.  
  5816.     TSTMOD
  5817.     BNE.S   .MOD
  5818.     MOVE.W  EFUNCJUMPL,NEWOP
  5819.     MOVE.W  EFUNCJUMPL020,NEWOP020
  5820.     BSR ADDBRANCH
  5821.     BRA.S   .CC
  5822. .MOD:
  5823.     SUBQ.L  #4,A4
  5824.     MOVE.W  EFUNCJUMPL(PC),(A4)+
  5825.     BSR ADDBRANCHRELOC
  5826.     MOVE.W  D0,-2(A4)
  5827. .CC:
  5828.     MULU    #10,D7
  5829.     MOVE.L  #EFUNCRAISE,A6
  5830.     LEA 0(A6,D7.W),A6
  5831.     TST.W   (A6)
  5832.     BEQ.S   .NR
  5833.     BSR EXPRAISE
  5834. .NR:
  5835.     TST.W   D2
  5836.     BEQ.S   .E
  5837.     LSL.L   #2,D2
  5838.     cmp.w   #8,d2
  5839.     ble     .E2
  5840.     btst    #1,ICODEPREFS+3
  5841.     bne     .E3
  5842.     MOVE.W  EXPGETSTACK(PC),(A4)+
  5843.     MOVE.W  D2,(A4)+
  5844.     bra     .E
  5845. .E2:and.l   #7,d2
  5846.     lsl.w   #8,d2
  5847.     lsl.w   #1,d2
  5848.     or.w    .FS,d2
  5849.     move.w  d2,(a4)+
  5850.     bra     .E
  5851. .E3:move.w  .FF,(a4)+
  5852.     move.w  d2,(a4)+
  5853. .E:
  5854.     MOVED0FP0
  5855.     BSR RD0
  5856.     CMP.W   #18,(A3)+       ; EAT )
  5857.     BNE ERROR23
  5858.     MOVEQ   #1,D5
  5859.     BRA EXPLOOP
  5860. .LEA:   adda.w #4,A7
  5861. .P: PEA 0.W
  5862. .FS:addq.l  #8,a7
  5863. .FF:adda.w  #4,a7
  5864. EFUNDA: ADDQ.L  #1,D0
  5865.     CMP.L   8(A0),D0
  5866.     BNE ERROR23
  5867.     MOVE.L  12(A0),D6
  5868.     BEQ ERROR23
  5869.     CMP.L   #-1,D6
  5870.     BNE.S   .SK
  5871.     MOVEQ   #0,D6
  5872. .SK:    MOVE.L  D6,D1           ;
  5873.     AND.L   #$FFFFFF00,D1       ; not really needed?
  5874.     BNE ERROR23         ;
  5875.     EXT.W   D6
  5876.     MOVE.W  .P(PC),(A4)+
  5877.     MOVE.W  D6,(A4)+
  5878.     RTS
  5879. .P: PEA 0.W
  5880.  
  5881. UPSTACK:
  5882.     MOVE.L  D0,-(A7)
  5883. EFUNCJUMP:
  5884.     BSR EFUNCJUMP
  5885. EFUNCJUMPL:
  5886.     JSR EFUNCJUMP
  5887. EFUNCJUMPL020:
  5888.     BSR.L EFUNCJUMP
  5889. WRITEFARG:
  5890.     MOVE.L  D0,4(A7)
  5891.     MOVE.L  D0,(A7)
  5892.  
  5893.  
  5894. EXPRAISE:             ; GETS PTR TO RAISESTRUCT IN A6,
  5895.     MOVEM.L D0/D1/A0,-(A7)      ; TRHASHES ONLY A6
  5896.     TST.L   6(A6)
  5897.     BEQ.S   .Z
  5898.     MOVE.W  .1(PC),(A4)+
  5899.     MOVE.L  6(A6),(A4)+
  5900.     BRA.S   .Z2
  5901. .Z: MOVE.W  .1B(PC),(A4)+
  5902. .Z2:    MOVE.W  (A6),D0
  5903.     SUB.W   #11,D0
  5904.     LSL.W   #1,D0
  5905.     MOVE.W  .2(PC,D0.W),(A4)+
  5906.     MOVE.L  A4,A0
  5907.     MOVE.W  .3(PC),(A4)+
  5908.     MOVE.L  2(A6),(A4)+
  5909.     MOVE.L  .4(PC),(A4)+
  5910.     MOVEQ   #92,D0          ; CAUSE
  5911.     MOVE.B  #-1,EFUNCBYTE+82
  5912.     MOVEM.L D0/A0,-(A7)
  5913.  
  5914.  
  5915.     TSTMOD
  5916.     BNE.S   .MOD
  5917.     MOVE.W  .5(PC),NEWOP
  5918.     BSR ADDBRANCH
  5919.     BRA.S   .CC
  5920. .MOD:   SUBQ.L  #4,A4
  5921.     MOVE.W  .5(PC),(A4)+
  5922.     BSR ADDBRANCHRELOC
  5923.     MOVE.W  D0,-2(A4)
  5924. .CC:
  5925.  
  5926.     MOVEM.L (A7)+,D0/A0
  5927.     MOVE.L  A4,D0
  5928.     SUB.L   A0,D0
  5929.     MOVE.B  D0,-1(A0)
  5930.     MOVEM.L (A7)+,D0/D1/A0
  5931.     RTS
  5932. .1: CMP.L   #1,D0
  5933. .1B:    TST.L   D0
  5934. .2: BNE.S   .1
  5935.     BLE.S   .1
  5936.     BGE.S   .1
  5937.     BLT.S   .1
  5938.     BGT.S   .1
  5939.     BEQ.S   .1
  5940. .3: MOVE.L  #1,-(A7)
  5941. .4: BSR.W   .3
  5942. .5: JSR .3
  5943.  
  5944. ;*-*
  5945. ;; EXPINLINE
  5946. EXPINLINE:
  5947.     CLR.L   LAST_CMD_ADR
  5948.     tst.l   d5
  5949.     bgt     ERROR0
  5950.     bmi     .n_d
  5951.     BSR     SD0
  5952. .n_d:
  5953.     cmp.w   #17,(a3)+
  5954.     bne     ERROR0
  5955.     MOVE.L  D0,-(A7)
  5956.     LEA     INLINETAB,A0
  5957.     MOVE.L  0(A0,D0),A0
  5958.     JSR     (A0)
  5959.  
  5960.     MOVED0FP0
  5961.     tst.l   d5
  5962.     bmi     .exit
  5963.     bsr     RD0
  5964. .exit:
  5965.     MOVe.L  (A7)+,D0
  5966.  
  5967.     MOVE.L  A0,-(A7)
  5968.     LEA     EFUNCFLAGSTAB,A0
  5969.     MOVE.L  0(A0,D0),D7
  5970.     BTST    #0,D7
  5971.     BEQ.S   .T0
  5972.     BSET    #3,CODEPREFS+1
  5973. .T0:BTST    #1,D7
  5974.     BEQ.S   .T1
  5975.     BSET    #4,CODEPREFS+1
  5976. .T1:BTST    #2,D7
  5977.     BEQ     .T2
  5978.     CMP.W   #37,OSVERSION
  5979.     BLT     ERROR78
  5980. .T2:BTST    #3,D7
  5981.     BEQ     .T3
  5982.     CMP.W   #39,OSVERSION
  5983.     BLT     ERROR78
  5984. .T3:BTST    #4,D7
  5985.     BEQ     .T4
  5986.     CMP.W   #1,ECPU
  5987.     BLT     ERROR53
  5988. .T4:BTST    #5,D7
  5989.     BEQ     .T5
  5990.     CMP.W   #2,ECPU
  5991.     BLT     ERROR53
  5992. .T5:BTST    #6,D7
  5993.     BEQ     .T6
  5994.     CMP.W   #1,EFPU
  5995.     BLT     ERROR53
  5996. .T6:BTST    #7,D7
  5997.     BEQ     .T7
  5998.     CMP.W   #2,EFPU
  5999.     BLT     ERROR53
  6000. .T7:BTST    #10,D7
  6001.     BEQ     .T8
  6002.     BSET    #3,CODEPREFS
  6003. .T8:BTST    #11,D7
  6004.     BEQ     .T9
  6005.     BTST    #6,CODEPREFS
  6006.     BEQ     ERROR85
  6007. .T9:
  6008.     MOVE.L  (A7)+,A0
  6009.  
  6010.     moveq   #1,d5
  6011.     cmp.w   #18,(a3)+
  6012.     bne     ERROR74
  6013.     bra     EXPLOOP
  6014.  
  6015. ;*-*
  6016. ;; LibFunc
  6017. EXPLIBFUNC:
  6018.     CLR.L   LAST_CMD_ADR
  6019.     CMP.W   #1,D5
  6020.     BEQ     ERROR0
  6021.  
  6022.     MOVE.L  (A3)+,A6
  6023.     MOVE.L  A6,-(A7)
  6024.  
  6025.  
  6026.     MOVEQ   #0,D6
  6027.     MOVE.W  LIB_ARGS(A6),D5
  6028.     subq.l  #1,d5
  6029. .checkit1:
  6030.     lsl.l   #1,d5
  6031.     cmp.b   #4,20(a6,d5)
  6032.     bne     .checkit1x
  6033.     moveq   #7,d7
  6034.     sub.b   21(a6,d5),d7
  6035.     cmp.b   #5,d7
  6036.     bpl     .checkit1x
  6037.     bset    d7,d6
  6038. .checkit1x:
  6039.     lsr.l   #1,d5
  6040.     dbf     d5,.checkit1
  6041.  
  6042. ;    move.w  d6,-(a7)
  6043.     tst.w   d6
  6044.     beq     .skp1
  6045.     lsl.l   #8,d6
  6046.     move.w  #$48e7,(a4)+
  6047.     move.w  d6,(a4)+
  6048. .skp1:
  6049.  
  6050.  
  6051.     CMP.W   #17,(A3)+
  6052.     BNE     ERROR0
  6053.     MOVEQ   #0,D6
  6054.     MOVE.W  D6,.TARGS
  6055.     tst.l   d5
  6056.     bmi     .X1
  6057.     BSR SD0
  6058. .X1:
  6059.     MOVE.W  #0,-(A7)
  6060.     CMP.W   #18,(A3)
  6061.     BEQ .NARGS
  6062. .ARGLOOP:
  6063.     ADDQ.W  #1,(A7)
  6064.     MOVE.W  #16,EAREQUEST
  6065.     BSR     EAEXP
  6066.     TST.L   D0
  6067.     BNE.S   .OPT
  6068.     MOVE.W  .4(PC),(A4)+
  6069. .OPT:
  6070.     CMP.W   #COM,(A3)+
  6071.     BEQ .ARGLOOP
  6072.     SUBQ.L  #2,A3
  6073. .NARGS:
  6074.     MOVE.W  (A7)+,.TARGS
  6075.     MOVE.L  (A7)+,A6
  6076.     MOVEQ   #0,D6
  6077.     MOVE.W  .TARGS,D6
  6078.     CMP.W   #18,(A3)+
  6079.     BNE     ERROR74
  6080.     TST.W   LIB_ARGS(A6)
  6081.     BPL     .ARGSPLUS
  6082.  
  6083.     MOVEQ   #0,D2
  6084.     MOVE.L  D6,D0
  6085.     ADDQ.L  #1,D6
  6086.     MOVE.W  LIB_ARGS(A6),D2
  6087.     EXT.L   D2
  6088.     NEG.L   D2
  6089.     SUBQ.L  #1,D2
  6090.  
  6091.     SUB.L   D2,D0
  6092.     BMI ERROR23
  6093.     LSL.L   #2,D0
  6094.  
  6095.     MOVE.W  .45(PC),(A4)+
  6096.     MOVE.W  .46(PC),(A4)+
  6097.     MOVE.W  D0,(A4)+
  6098.     MOVE.L  D0,D2
  6099.     LSR.L   #3,D2
  6100.     SUBQ.L  #1,D2
  6101.     BMI .CD
  6102. .XYZ:
  6103.     MOVE.L  .47(PC),(A4)+
  6104.     MOVE.W  .47+4(PC),(A4)+
  6105.     DBF     D2,.XYZ
  6106. .CD:
  6107.     SWAP    D0
  6108.     TST.W   D0
  6109.     BNE     .LOADS
  6110.     SWAP D0
  6111.     MOVE.W  .43(PC),(A4)+
  6112.     MOVE.W  D0,(A4)+
  6113.     BRA .ARGSPLUS2
  6114. .LOADS:
  6115.     SWAP    D0
  6116.     MOVE.W  .44(PC),(A4)+
  6117.     MOVE.L  D0,(A4)+
  6118.     BRA .ARGSPLUS2
  6119. .ARGSPLUS:
  6120.     CMP.W   LIB_ARGS(A6),D6
  6121.     BNE     ERROR23
  6122. .ARGSPLUS2:
  6123.     CMP.W   #1,LIB_TYPE(a6)
  6124.     beq .INLINE
  6125.  
  6126.     BSR     PUTLIBBRANCH
  6127.  
  6128.     LSL.W   #2,D6
  6129.     TST.L   D6
  6130.     BEQ .EXIT
  6131.     MOVE.W  .LEA(PC),(A4)+
  6132.     MOVE.W  D6,(A4)+
  6133. .EXIT:
  6134.     MOVED0FP0
  6135.     tst.l   d5
  6136.     bmi     .X2
  6137.     BSR RD0
  6138. .X2:
  6139.     MOVEQ   #1,D5
  6140.     BRA EXPLOOP
  6141.  
  6142. .TARGS:
  6143.     DC.W    0
  6144. .LEA:
  6145.     LEA     4(A7),A7
  6146. .4:
  6147.     MOVE.L  D0,-(A7)
  6148. .42:
  6149.     MOVE.L  (A7)+,D0
  6150. .43:
  6151.     PEA $0.W
  6152. .44:
  6153.     PEA $0
  6154. .45:
  6155.     MOVE.L  A7,A0
  6156. .46:
  6157.     LEA 4(A7),A1
  6158. .47:
  6159.     MOVE.L  (A0),D0
  6160.     MOVE.L  -(A1),(A0)+
  6161.     MOVE.L  D0,(A1)
  6162.  
  6163. .INLINE:
  6164.     MOVE.W  LIB_ARGS(A6),D5
  6165.     BEQ     .INLCNT
  6166.     SUBQ.L  #1,D5
  6167. .INLMOVE:
  6168.     MOVE.W  .42(PC),(A4)
  6169.     MOVEQ   #0,D0
  6170.     MOVE.B  20(a6,d5),d0
  6171.     cmp.b   #4,d0
  6172.     SPL     D1
  6173.     AND.W   #$40,D1
  6174.     OR.W    D1,(A4)
  6175.     AND.B   #3,D0
  6176.     LSL.L   #8,D0
  6177.     LSL.L   #1,D0
  6178.     OR.W    D0,(A4)+
  6179.     DBF D5,.INLMOVE
  6180. .INLCNT:
  6181.     MOVE.L  A6,-(A7)
  6182.     MOVE.L  LIB_CODE(A6),A6
  6183.     MOVE.L  (A6)+,D0
  6184.     LSR.L   #1,D0
  6185.     SUBQ.L  #1,D0
  6186.     MOVE.L  A4,-(A7)
  6187. .INLCPY:
  6188.     MOVE.W  (A6)+,(A4)+
  6189.     DBF D0,.INLCPY
  6190.     MOVE.L  (A7)+,A6
  6191.     MOVe.L  (A7)+,d0
  6192.     move.l  a0,-(a7)
  6193.     move.l  d0,a0
  6194.     subq.l  #4,a6
  6195.     JSR FIXRELOC
  6196.     move.l  (a7)+,a0
  6197.     BRA .EXIT
  6198.  
  6199. ;*-*
  6200.  
  6201. ;; GetExp
  6202. ; params: D0 -> final storage
  6203. EA_GETEXP:
  6204.     move.l  d0,-(a7)
  6205.  
  6206.     BSR.W   EXP
  6207.  
  6208.     move.l  (a7)+,d0
  6209.     TST.W   D0
  6210.     BEQ     .x
  6211.     move.w  .res(PC),(A4)
  6212.     OR.W    D0,(A4)+
  6213. .x:
  6214.     RTS
  6215. .res:
  6216.     MOVE.L  D0,D0
  6217. ;*-*
  6218.  
  6219. ;; <=>
  6220. ; WARNING: AMAZING FEATURE AHEAD!
  6221.  
  6222. EXPUNIFY:
  6223.     CMP.W   #1,D5
  6224.     BNE ERROR0
  6225.     MOVEQ   #-1,D7          ; D7 = LEVEL/#OF_AX_USED
  6226.     BSR NEWLABEL
  6227.     MOVE.L  D0,D6           ; D6 = FALSELABEL
  6228.     CLR.W   NEWOP
  6229.     BSR.S   .R
  6230.  
  6231.     CMP.W   #1,EXPRECC
  6232.     BNE.S   .DI
  6233.     TST.W   EXPSTAT
  6234.     BNE .SR
  6235.  
  6236. .DI:    CMP.W   #-2,D7
  6237.     BEQ.S   .SH
  6238.     MOVE.L  .TRUE(PC),(A4)+
  6239.     MOVE.L  D6,D0
  6240.     BSR ADDLABEL
  6241.     MOVE.W  .FALSE(PC),(A4)+
  6242.     BRA EXPLOOP
  6243. .SH:    MOVE.W  .TRUE(PC),(A4)+
  6244.     BRA EXPLOOP
  6245.  
  6246. .SR:    MOVE.L  D6,D0
  6247.     BSR ADDLABEL
  6248.     BRA EXPLOOP
  6249.  
  6250. .R: MOVE.W  (A3)+,D0        ; RECURSIVE PART
  6251.     CMP.W   #VALUE,D0
  6252.     BNE.S   .1
  6253. .0: MOVE.L  (A3)+,D0
  6254. .0B:    TST.L   D7          ; VALUE
  6255.     BMI.S   .1B
  6256.     MOVE.W  .CMP2(PC),(A4)
  6257.     OR.W    D7,(A4)+
  6258.     BRA.S   .1C
  6259. .1B:    MOVE.W  .CMP(PC),(A4)+
  6260. .1C:    MOVE.L  D0,(A4)+
  6261.     MOVE.L  .BNE(PC),(A4)+
  6262.     MOVE.L  D6,D0
  6263.     BSR ADDBRANCH
  6264.     BRA .X
  6265.  
  6266. .1: CMP.W   #IDENT,D0
  6267.     BNE .2
  6268.     TST.L   D7          ; IDENT
  6269.     BMI.S   .2B
  6270.     MOVE.W  .M2(PC),(A4)
  6271.     OR.W    D7,(A4)+
  6272.     BRA.S   .2C
  6273. .2B:    MOVE.W  .M(PC),(A4)+
  6274.     SUBQ.L  #1,D7           ; AT TOP LEVEL: ALWAYS TRUE
  6275. .2C:    MOVE.L  (A3)+,A0
  6276.     BSR GVA0D0_9
  6277.     BRA.W   .X
  6278.  
  6279. .2: CMP.W   #29,D0
  6280.     BNE.S   .3
  6281.     ADDQ.L  #4,A3           ; LIST
  6282.     CLR.W   -(A7)           ; TOP STACK = NUM ELEMENTS
  6283.     TST.L   D7
  6284.     BMI.S   .3B
  6285.     MOVE.W  .GET2(PC),(A4)
  6286.     OR.W    D7,(A4)
  6287.     BRA.S   .3C
  6288. .3B:    MOVE.W  .GET(PC),(A4)
  6289. .3C:    ADDQ.L  #1,D7
  6290.     CMP.W   #4,D7
  6291.     BEQ ERROR46
  6292.     MOVE.L  D7,D0
  6293.     MOVEQ   #9,D1
  6294.     LSL.W   D1,D0
  6295.     OR.W    D0,(A4)+
  6296.     MOVE.W  .LEN(PC),(A4)
  6297.     OR.W    D7,(A4)+
  6298.     MOVE.L  A4,A6           ; A6=PATCHBACK
  6299.     MOVE.W  D0,(A4)+        ; DUM D0
  6300.     MOVE.W  #-2,(A4)+
  6301.     MOVE.L  .BNE(PC),(A4)+
  6302.     MOVE.L  D6,D0
  6303.     BSR ADDBRANCH
  6304. .XL:MOVE.L  A6,-(A7)
  6305.     BSR.W   .R
  6306.     MOVE.L  (A7)+,A6
  6307.     ADDQ.W  #1,(A7)
  6308.     CMP.W   #COM,(A3)+
  6309.     BEQ.S   .XL
  6310.     CMP.W   #30,-2(A3)
  6311.     BNE ERROR34
  6312.     MOVE.W  (A7)+,(A6)
  6313.     SUBQ.L  #1,D7
  6314.     BRA.W   .X
  6315.  
  6316. .3: CMP.W   #8,D0
  6317.     BNE.S   .4
  6318.     CMP.W   #VALUE,(A3)+        ; -VALUE
  6319.     BNE ERROR30
  6320.     NEG.L   (A3)
  6321.     BRA .0
  6322.  
  6323. .4: CMP.W   #13,D0          ; <CONS|CELL>
  6324.     BNE.S   .5
  6325.     TST.L   D7
  6326.     BMI.S   .4B
  6327.     MOVE.W  .GET2(PC),(A4)      ; GET CELL IN A0
  6328.     OR.W    D7,(A4)
  6329.     BRA.S   .4C
  6330. .4B:    MOVE.W  .GET(PC),(A4)
  6331. .4C:    ADDQ.L  #1,D7
  6332.     CMP.W   #4,D7
  6333.     BEQ ERROR46
  6334.     MOVE.L  D7,D0
  6335.     MOVEQ   #9,D1
  6336.     LSL.W   D1,D0
  6337.     OR.W    D0,(A4)+
  6338. .4L:    BSR.W   .R
  6339.     CMP.W   #COM,(A3)+
  6340.     BNE.S   .4D
  6341.     MOVE.W  .CDR(PC),(A4)
  6342.  
  6343.     MOVE.L  D7,D0
  6344.     MOVEQ   #9,D1
  6345.     LSL.W   D1,D0
  6346.     OR.W    D7,D0
  6347.     OR.W    D0,(A4)+
  6348.  
  6349.     BRA.S   .4L
  6350. .4D:    CMP.W   #46,-(A3)
  6351.     BNE.S   .4E
  6352.     ADDQ.L  #2,A3
  6353.     BSR.W   .R
  6354.     BRA.W   .4F
  6355. .4E:    ; TEST CDR=0 HERE
  6356.  
  6357.     MOVE.W  .NIL(PC),(A4)
  6358.     MOVE.L  D7,D0
  6359.     OR.W    D7,(A4)+
  6360.     MOVE.L  .BNE(PC),(A4)+
  6361.     MOVE.L  D6,D0
  6362.     BSR ADDBRANCH
  6363.  
  6364. .4F:    CMP.W   #12,(A3)+
  6365.     BNE ERROR0
  6366.     SUBQ.L  #1,D7
  6367.     BRA.S   .X
  6368.  
  6369. .5: CMP.W   #16,D0
  6370.     BNE.S   .6
  6371.     MOVEQ   #0,D0
  6372.     BRA.W   .0B
  6373.  
  6374. .6: ; OTHER TYPES
  6375.     BRA ERROR0
  6376.  
  6377. .X: RTS
  6378.  
  6379. .CMP:   CMPI.L  #1,D0
  6380. .CMP2:  CMPI.L  #1,(A0)+
  6381. .M: MOVE.L  D0,2(A5)
  6382. .M2:    MOVE.L  (A0)+,2(A5)
  6383. .BNE:   BNE .CMP
  6384. .TRUE:  MOVEQ   #-1,D0
  6385.     BRA.S   .FALSE+2
  6386. .FALSE: MOVEQ   #0,D0
  6387. .GET:   MOVE.L  D0,A0
  6388. .GET2:  MOVE.L  (A0)+,A0
  6389. .LEN:   CMPI.W  #1,-2(A0)
  6390. .CDR:   MOVE.L  (A0),A0
  6391. .NIL:   TST.L   (A0)
  6392.  
  6393. ;*-*
  6394. FINISHFPEXP:
  6395.     DC.W    0
  6396. ;*-*
  6397.  
  6398.